普通程序员用迭代,大神用递归,好多人在用递归!
递归的一些应用:汉罗塔游戏、树结构的定义、谢尔宾斯基三角形、递归自拍、
递归就是函数在内部调用自己
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')