-
递归函数:自己调用自己?
- 递归函数是自己调用自己的过程,必须要有出口,停止自己调用自己,并逐渐逐层返回值。
- 将递归函数看成一个圆盘,每调用自己一次就放入一个,直到满足某种条件不再继续自己调用自己,就停止,并且从顶部慢慢拿出,上面计算出结果得到下面的结果。
-
递归函数是如何自己调用自己的?
递归函数是通过压栈的方式自己调用自己。用斐波那契数列来举例:
def feibo(n):
if n==0:
return 0
elif n==1:
return 1
return feibo(n-2) + feibo(n-1) #内部函数调用自己
print(feibo(6))
要得到f(2)就要先算出发f(1)和f(0),结果就是要至下而上:
由上面两个得到下面的结果
f(5)是由f(3) + f(4) 得到的,最终结果就是返回了f(3) + f(4)
-
只有自己调用自己才是递归函数?
可以把一些函数进行压栈再出栈也是递归。 -
通过归并排序深度了解递归:
归并排序:
拆:把整个列表拆成单个元素,用到递归:
并:把元素按照规则排序合并,用到递归:
def merge_sort(alist):
n=len(alist)
if n<2:
return alist
mid = n // 2
left_li = merge_sort(alist[0:mid])
right_li = merge_sort(alist[mid:])
# 逐步合并
result = []
left_pointer, right_pointer = 0,0
while left_pointer < len(left_li) and right_pointer <len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
# 循环结束之后有某个列表中比较大的是剩下的加到result
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
if __name__ == '__main__':
l = [8,4,5,7,1,3,6,2 ]
print(merge_sort(l))
压栈操作:每个递归函数都应该有返回值,因为上一个函数需要用到当前返回值