Tree Recursion
Order of Recursive Calls
e.g.1:Cascade
1 | def cascade(n): |
结果为
1 | cascade(12345) |
首先一直调用cascade到底,返回None,从调用入口出来后继续执行cascade下面的语句
还可以缩短为以下
1 | def cascade_short(n): |
e.g.2:Inverse Cascade
1 | def inverse_cascade(n): |
grow先进行处理,每次将数字缩短一节,到达递归底部后退出时便是从小到大依次输出
shrink先打印出来当前n,然后将数字缩短一节,这样递归过程便实现了从大到小依次输出
Tree Recursion
当递归函数对自身调用超过一次时,发生树形递归,产生树状过程
e.g.1 斐波那契数列
1
2
3
4
5
6
7def fib(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-1)+fib(n-2)
e.g.2 计算分区
将正整数n分为大小不超过m的分区的方式有多少种,即n能以多少种方式表示为递增的不超过m部分之和
e.g. count_partitions(6,4)
有以下可能:
……
分为两种情况考虑:
- 至少分一个4
- 不分4
这样我们可以把递归问题拆分为两个小问题,将两种情况相加
count_partitions(2,4)
count_partitions(6,3)
以此类推,count_partitions(6,3)按同样方式考虑,分3与不分3,直到递归底部
1 | def count_partitions(n,m): |