算法基础之递归算法

'''递归,在一个函数内部调用自身本身,就叫做递归函数,
递归的主要思想就是把现在要做的事情放到上一个事情,依次类推,最终得到自己想要的结果,就如著名的汉诺塔问题,用递归函数可以很方便的解答'''
'''汉诺塔问题:有a,b,c三根主子,n个盘子,从下往上按照大小顺序摞着n个盘子,每次只能移动一个盘子,而且大盘子不能放在小盘子上面,
问总共要移动多少次才能将盘子全部从a移到c,并打印出移动顺序'''
'''思路:每一次都是先将a盘的n-1个盘子放到b盘,再将a盘的最后一个盘子放入c盘,关于步骤,将n-1个盘子借c盘从a盘移到b盘后,
再把第n个从a盘移到c盘,最后再借c盘把n-2个盘子从b盘移到a盘,再将第n-1个盘子从b盘移到c盘'''
def move(n,a,b,c):
#a是初始盘,b是中间盘,c是目标盘
if n==1:
print (a,'-->',c)
else:
move(n-1,a,c,b)
print(a,'-->',c)
move(n-1,b,a,c)
print(move(3,'A','B','C'))
''''''
'''-------递归问题拓展-------'''
'''Fibonacci问题:这个问题是:有小兔一对,若第二个月它们成年,第三个月生下小兔一对,以后每月生产一对小兔,而所生小兔亦在第二个月成年,
第三个月生产另一对小兔,以后亦每月生产小兔一对,假定每产一对小兔必为一雌一雄,且均无死亡,试问一年后共有小兔几对?'''
'''思路:第一个月有一对小兔子,第二个月后这对兔子成年了,第三个月生产了一对兔子,第四个月后原来的兔子又生产了一对兔子,
而第三个月生产的小兔子成年了...依次类推,可以知道,主要是由两种兔子,一种是还未成年的兔子,第二种是已经成年的兔子,
而已经成年的兔子会每个月都生产一对兔子,未成年的兔子会在下个月生产一对兔子,设第一个月有n对兔子,
则第n个月的兔子数量会等于第n-1个月的兔子数量加上第n-1个月的兔子生产的兔子数量(即第n-1个月的未成年兔子数量),所以可以总结出这个月的未成年兔子数量等于上个月的兔子总数,
可列出方程f(n)=f(n-1)+f(n-2)'''
def rab(n):
if n==1 or n==2:
return 1
elif n>2: #这里的判断条件不能少...如果是不加则可能一直到负数...
return rab(n-1) + rab(n-2)
elif n<=0:
return ('输出错误')
print (rab(10))
posted @ 2017-12-15 15:07  陌离殇  阅读(253)  评论(0编辑  收藏  举报