2.选择排序和递归

现在有一个无序数组,需要把数组里面的数字按照从小到大的顺序排列,我们可以怎么做?

比较简单的一个方法是挨个去查看数组里面的数字,找到最小的一个数字,然后把找到的这个最小数字放进一个新数组,接下来再去找原先数组里面剩下的数字中最小的数字,找到后再放入新数组的末尾,这样一直操作到数组中的数字被找完为止。

这种方法就是选择排序,不断选择最小的数,然后进行排序。

def find_smallest(arr):
    smallest = arr[0]
    index = 0
    for i in range(1, len(arr)):
        if smallest > arr[i]:
            smallest = arr[i]
            index = i
    return index


def selection_sort(arr):
    new_arr = []
    for _ in range(len(arr)):
        smallest_index = find_smallest(arr)
        new_arr.append(arr.pop(smallest_index))
    return new_arr

print(selection_sort([4, 1, 5, 3, 2, 8, 7, 6, 9]))

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果现在需要去一棵树的顶端摘一个果子,一般是先爬到第一个树干,然后再去第二个树干,一直到树的顶端,摘到果子后,还要从最靠近顶端的一个树干,一个一个爬下来,递归和这个有点儿像。递归中有两个条件,决定了这个递归是可执行的,第一个是基线条件,在这里就是能够在树上摘到果子,第二个是递归条件,这里就是可以到达下一个树干。这里还有一个栈的概念,就类似于爬的树干,一个个爬上去,最后还得一个个爬下来。但是不一样的是,栈的数据是一个个从压进去,然后从顶部一个个拿出来。

一个比较简单的例子就是用递归来计算阶乘,

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1)
print(fact(5))

>>>
120

可以看出,在计算过程中,把先计算出来的数放在一边,直到最后达到基线条件时在一个个取出来继续运算。

你可能感兴趣的:(2.选择排序和递归)