Python函数递归,第五周
-字符串反转
-汉诺塔
-斐波那契数列
1. 字符串反转
在Python中字符串反转可以用
>>> s[ : : -1]
直接实现,那怎么自己写函数实现?
用归纳法的方法整理过程如下:
(1)当数组s长度为0时数组的反转数组函数为:rvs
rvs(s)=s[-1]
(2)当数组s长度为1时数组的反转数组函数为:rvs
rvs(s)=s[-1]
(3)当数组s长度为2时数组的反转数组函数为:rvs
rvs(s)=s[1]+s[-1]
(4)当数组s长度为3时数组的反转数组函数为:rvs
rvs(s)=s[2]+s[1]+s[0]=s[-1]+rvs(s[:-1])
(4)当数组s长度为4时数组的反转数组函数为:rvs
rvs(s)=s[3]+s[2]+s[1]+s[0]=s[-1]+rvs(s[:-1])
......
综上可知:
rvs(s) = s[-1] + rvs(s[0:-1])
则python函数可定义为
def rvs(s):--if s == '' :---- return s--else :----return s[-1] + rvs(s[:-1])a='123456'print(rvs(a))
2. 汉诺塔
汉诺塔即将如图所示的塔片从一根柱子上移到另一根柱子上,移动过程中小片必须在大片之上,每次只能移动一片,第三根柱子为辅助移动柱子
A B C
移动过程中定义最小圆环序号为1,圆环越大序号越大
归纳法分析问题:
(1)一片圆环
圆环由A移动到C,移动规则为:
1 : A->C
(2)两片圆环
1 : A->B
2 : A->C
1 : B->C
(3)三片圆环
1 : A->C
2 : A->B
1 : C->B
3 : A->C (3被移到C柱最底端)
1 : B->A
2 : B->C
1 : A->C
(4)四篇圆环
因4号圆盘最大只要放在柱子最底端就可以先不管4,
将123按三片圆环方法移动至B柱,
再将4移动至C柱,
最后再将123按三篇圆环方法移至C柱即完成移动
......
同理,
对于N个圆盘移动的过程可以分解为:
-将1至N-1号圆盘移动至B柱
-将N号圆盘移动至C柱
-将1至N-1号圆盘移动至C柱
python代码实现如下:
count = 0def hanoi(n, src, dst, mid):--global count--if n == 1 :----print("{}:{}->{}".format(1,src,dst))----count += 1--else :----hanoi(n-1, src, mid, dst)----print("{}:{}->{}".format(n,src,dst))----count += 1----hanoi(n-1, mid, dst, src)hanoi(3, "A", "C", "B")print(count)
运行结果:
1:A->C2:A->B1:C->B3:A->C1:B->A2:B->C1:A->C7
3. 斐波那契数列
斐波那契数列:F(n) = F(n-1) + F(n-2)
python实现:
def f(n):--if n == 1 or n == 2 :----return 1--else :----return f(n-1) + f(n-2)
print(f(10))
>>>55
大家可以试试f(100)这个结果运行出来需要花费很长时间,甚至无法运行出结果,这就提醒我们在使用递归的时候要考虑计算的时间复杂度。