高渐飞 发表于 2018-7-12 15:50:01

A-10-递归总结与练习

本帖最后由 高渐飞 于 2018-7-16 15:20 编辑

#知识点总结
#(1)递归即函数内部自己调用自己;必须要有正确的返回值;
#(2)每次递归都需要建栈,弹栈,清理,消耗内存,因此当递归无返回值或返回值错误时,会导致代码无休止的运行直到程序崩溃
#(3)斐波那契数列,又称黄金分割数列,兔子序列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
#(4)汉诺塔:假设汉诺塔有x,y,z三根柱子,已知柱子x上有n个盘子,盘子大小各不相同呈金字塔状放置;
#   要求将n个盘子从柱子x上移到柱子z上,条件是每次只能移到一个盘子,而且必须永远是大盘子在下小盘子在上的移到状态。
#   将n个盘子从柱子x移到柱子z上,无法直接实现该过程,需借助柱子y;
#      首先,将柱子x上的n-1个盘子移动到柱子y上;
#      然后,将柱子x上最后一个盘子移动到柱子z上;
#      最后,将柱子y上的n-1个盘子移动到柱子z上。

#练习部分
#coding: UTF-8

#1.实现阶乘
def factorial(n):
    if n == 1:
      return 1
    else:
      return n * factorial(n-1)

number = int(input('请输入一个正整数:'))
result = factorial(number)
print("%d 的阶乘是:%d" % (number, result))


#2.用迭代法(循环)实现斐波那契数列,并输出
def fab(n):
    n1 = 1
    n2 = 1   
    temp="1 1"
    if n < 1:
      print('输入有误!')
      return -1
    else:
      print("0-n之间的斐波那契数列为:\n",temp,end=" "),
      while (n-2) > 0:
            n3 = n1 + n2
            n1 = n2
            n2 = n3
            n -= 1
            print(n3,end=" ")      #使用end=" "可以避免换行,end默认为"\n"
      return n3
   
num = int(input("请输入数列的层数:"))
result = fab(num)
if result != -1:
        print('\n总共有%d对小兔崽子诞生!' % result)


#3.用递归法实现斐波那契数列,并输出
def fab(n):
    if n < 0:
      print("输入有误!")
    elif n ==1 or n==2:
      return 1
    else:
      return fab(n-1) + fab(n-2)
   
num = int(input("请输入数列的层数:"))
if num <= 0:
    print("请输入正整数!")
else:
    print("0-n之间的斐波那契数列为:\n",end=' ')
    for i in range(1,num+1):
      print(fab(i), end="; ")

#4.汉诺塔
def hanoi(n, x, y, z):
    if n == 1:
      print(x, ' --> ', z)
    else:
      hanoi(n-1, x, z, y)   #将前n-1个盘子从x移动到y上
      print(x, ' --> ', z ) #将最底下的最后一个盘子从x移动到z上
      hanoi(n-1, y, x, z)   #将y上的n-1个盘子移动到z上

n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'x', 'y', 'z')
页: [1]
查看完整版本: A-10-递归总结与练习