不得不使用递归的地方:
- 汉诺塔
- 目录索引(因为你永远不知道这个目录里边是否还有目录)
- 快速排序(二十世纪十大算法之一)
- 树结构的定义等如果使用递归,会事半功倍,否则会导致程序无法实现或相当难以理解
使用递归求阶乘:
def factorial(n):
result = n
for i in range(1,n):
result *= i
return result
number = int(input('请输入一个正整数:'))
result=factorial(number)
print("%d 的阶乘是 :%d"%(number,result))
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))
递归:有进去,就必有回来。必须要有停止的条件,要不然就是死循环。
必须满足两个条件:函数调用自身,设置了正确的返回条件
在编程上,递归表现为函数调用本身这么一个行为
递归的优缺点
优点:
1)递归的基本思想是把规模大的问题转变成规模小的问题组合,从而简化问题的解决难度(例如汉诺塔游戏)。
2)有些问题使用递归使得代码简洁易懂(例如你可以很容易的写出前中后序的二叉树遍历的递归算法,但如果要写出相应的非递归算法就不是初学者可以做到的了。)
缺点:
1)由于递归的原理是函数调用自个儿,所以一旦大量的调用函数本身空间和时间消耗是“奢侈的”(当然法拉利也奢侈,但还是很多人趋之若鹜)。
2)初学者很容易错误的设置了返回条件,导致递归代码无休止调用,最终栈溢出,程序崩溃。
假设需要求出经历了20个月后,总共有多少对小兔子(迭代 VS递归)
迭代的方式实现:
def fab(n):
n1 = 1
n2 = 1
n3 = 1
if n < 1:
print("输入有误!")
return -1
while(n-2) > 0:
n3 = n2 + n1
n1 = n2
n2 = n3
n-=1
return n3
result = fab(20)
if result !=-1:
print("总共有%d对小兔子诞生!"%result)
递归的方法实现:
def fab(n):
if n < 1:
print("输入有误!")
return -1
if n==1 or n==2:
return 1
else:
return fab(n-1) + fab(n-2)
result = fab(20)
if result !=-1:
print("总共有%d对小兔子诞生!"%result)
汉诺塔的代码解释过程:
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')