Python:函数5——递归

普通程序员用迭代,大神用递归,好多人在用递归!

递归的一些应用:汉罗塔游戏、树结构的定义、谢尔宾斯基三角形、递归自拍、

递归就是函数在内部调用自己

python3对递归深度的默认设置100层,如果写爬虫可能不止100层!修改递归深度:

>>> import sys
>>> sys.setrecursionlimit(100000)
>>> 

用递归求阶乘

非递归版本:

 11 def func(n):
 12     result = n
 13     for i in range(1, n):
 14         result *= i
 15     return result
 16 number = int(input('请输入一个正整数:'))
 17 result = func(number)
 18 print('%d的阶乘是:%d' % (number, result))
递归版本:

  1 def recurse(n):
  2     if n == 1:
  3         return 1
  4     else:
  5         return n * recurse(n-1)
  6 number = int(input('请输入一个正整数:'))
  7 result = recurse(number)
  8 print('%d的阶乘是:%d % (number, result))
两个条件:1、有调用自身的行为(递);2、有一个正确的结束条件(归)

当达到结束条件后,有一层层返回的的行为

递归的缺点:使用不当递归效率会非常低,占资源;但容易理解

代码简介,精炼,所以要用对地方,比如树结构定义、解汉罗塔;’阶乘没必要用递归,因为非递归简单,并且python对递归有限制,即便没有限制,当用户给的值大时也会耗尽资源

斐波那契额数列的递归实现

已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后第二个月就开始生小兔子。假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?1 1 2 3 5 8 13 21 34 55 89 144 233  (越往后比值越接近黄金分割比)

迭代算法:

  1 def fab(n):
  2     n1 = 1
  3     n2 = 1
  4     n3 = 3
  5     if n <= 0:
  6         print('your input must greater then 0')
  7         return -1
  8     while n-2 > 0:
  9         n3 = n1 + n2
 10         n1, n2 = n2, n3
 11         n -= 1
 12 
 13     return n3
 14 result = fab(8)
 15 if result != -1:
 16     print('%d的feb值是:%d' % (8, result))

递归算法:

  1 def fab(n):
  2     if n < 1:
  3         print('输入有误!')
  4         return -1
  5     elif n == 1 or n == 2:
  6         return 1
  7     else:
  8         return fab(n-1) + fab(n-2)
  9 result = fab(8)
 10 if result != -1:
 11     print('%d的feb值是:%d' % (8, result))

例如当35时递归效率低就显现出来了

递归求解汉诺塔

“将x上的63个盘子借助Y移动到Z上”拆解为:

a、将前62个盘子从X移动到Y上;

b、将最底下的第63个盘子移动到Z上;

c、将Z上的62个盘子移动到Z上;

  1 def hanoi(n, x, y, z):
  2     if n == 1:
  3         print(x, ' --> ', z)
  4     else:
  5         hanoi(n-1, x, z, y)     #将前n-1个盘子从x移动到y上
  6         print(x, ' --> ', z)    #将最低下的最后一个盘子从x移动到z上
  7         hanoi(n-1, y, x, z)     #将y上的n-1个盘子移动到z上
  8 
  9 hanoi(3, 'x', 'y', 'z')




  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值