Python递归算法的应用(斐波那契数列,汉诺塔)
记录一下以前学过的东西(* ̄︶ ̄)
-
什么是递归
有人可能会说,从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事,讲从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事,讲…这大概就是递归。这样的说法是有缺陷的,应该是后来终于有一天,老和尚的故事讲完了(为什么讲完了,你懂的),这才是递归。在函数的定义中使用函数自身的方法,最后还需要输出结果。 -
递归和循环在斐波那契数列的应用
-
斐波那契数列:
1 1 2 3 5 8 13 21 34…
又称黄金分割数列,是因为当数列趋于无穷时,数列的前一项和后一项的比值越接近于黄金比例0.618。
又称兔子数列,是根据兔子的繁殖得名,第一个月有一对兔子,第二个月繁殖期不生新的兔子,所以还是一对兔子,第三个月这对兔子生一对兔子,一共两对兔子,第四个月又生下一对,第三月刚生下的那对进入繁殖期,不生…如此循环,每对兔子生下来会经历一个月繁殖期,每个月的兔子总数就是斐波那契数列。废话不多说,打码 -
循环计算斐波那契
def Fibonacci(n):
n1 = 1
n2 = 1
n3 = 1
while (n-2)>0:
n3 = n2+n1
n1 = n2
n2 = n3
n -= 1
return n3
month=int(input('请输入一个正整数:'))
result=Fibonacci(month)
print('第%d 月份的兔子数量为 %d' % (month,result))入代码片
- 递归计算斐波那契
def Fibonacci(n):
if n == 1 or n == 2:
return 1
elif n>2:
return Fibonacci(n-1)+Fibonacci(n-2)
month=int(input('请输入一个正整数:'))
result=Fibonacci(month)
print('第%d 月份的兔子数量为 %d' % (month,result))
显然,递归实现简单,可读性强,但是占用空间大
- 递归汉诺塔中的应用
在印度,有一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。(这群印度人要是那个时候会递归僧侣们会被打死)
我们需要按照规则将A上的盘子(没有金片就用盘子了)移动到C上
def hanoi(n,a,b,c): # 将n个盘子借助b从a移动到c
if n == 1:
print(a,'-->',c)
else:
hanoi(n - 1, a, c, b) # 先将n-1个盘子借助c从a移动到b
print(a,'-->',c) # 再将第n个盘子从a移动到c
hanoi(n - 1, b, a, c) # 将n-1个盘子借助a从b移动到c
n = int(input('汉诺塔的层数为:'))
hanoi(n,'A','B','C')
好了,仅仅只是记录下以前学过的一些东西,写的不好就请见谅