python之递归

递归的定义:即对自己自身内容的引用。

有用的递归函数应包含以下几步份:

  • 当函数直接返回值时有基本的实例(最小可能性问题);
  • 递归实例,包括一个或者多个问题较小部分的递归调用;

递归的关键就是将问题分解为小部分,说白了就是递归不能无休止的执行下去,因为它总是以最小可能性问题结束。

递归实现阶乘:

阶乘的数学定义:

  • 1的阶乘是1;
  • 大于1的数n的阶乘就是n乘n-1的阶乘;
    1 # -*- coding: utf-8 -*-
    2 def factorial(n):
    3     if n==1:
    4         return 1
    5     else:
    6         return n * factorial(n-1)
    7 number = int(input("请输入一个数:"))
    8 print factorial(number)

递归实现整数的幂:

幂的递归设计:

  • 对于任何整数x,power(x,0)是1;
  • 对于任何大于0的数来说,power(x,n)是x乘以(x,n-1)的结果;
    1 # -*- coding: utf-8 -*-
    2 def power(x,n):
    3     if n==0:
    4         return 1
    5     else:
    6         return x*power(x,n-1)
    7 x = int(input("请输入整数x: "))
    8 num = int(input("请输入幂整数n:"))
    9 print power(x,num)

     

递归实现费纳波切数列:

  • 1,1,2,3,5,8,13,21,34,55,89,144,233,377.............(当n>3时,为前两项之和)
     1 # -*- coding: utf-8 -*-
     2 def sequence(n):
     3     if n==1:
     4         return 1
     5     elif n==2:
     6         return 1
     7     else:
     8         return sequence(n-1)+sequence(n-2)
     9 num = int(input("请输入n:"))
    10 print sequence(num)

    当n很大时,递归实现速度非常慢。

递归实现汉诺塔:

算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。

            当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。

            当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。

           当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。

          综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。

 

 1 # -*- coding: utf-8 -*-
 2 
 3 #该函数表示将x移到z上借助y
 4 def hanoi(n,x,y,z):
 5     if n == 1:
 6         print (x,'-->',z)
 7     else:
 8         #将n-1个盘子从x移到y借助z
 9         hanoi(n-1,x,z,y) #将n-1个盘子从x移到y
10         print (x,'-->',z)#将最后一个盘子从x移到z上
11         # 将n-1个盘子从y移到z借助x
12         hanoi(n-1,y,x,z) #将y上n-1个盘子移到z上
13 num = int(input("请输入层数:"))
14 hanoi(num,'A','B','C')

 

posted on 2016-10-24 16:32  wode未来  阅读(871)  评论(0编辑  收藏  举报