递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推
回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯
什么是递归?
1.递归用一种通俗的话来说就是自己调用自己,但是需要分解它的参数,
2.让它解决一个更小一点的问题,当问题小到一定规模的时候,
3.需要一个递归出口返回。
1.递归必须包含一个基本的出口(base case),
否则就会无限递归,最终导致栈溢出。
比如这里就是n==0返回1
2.递归必须包含一个可以分解的问题(recursive case).
要想求得fact(n),就需要用 n*fact(n-1)
3.递归必须要向着递归出口靠近(toward the base case).
这里每次递归调用都会n-1,向着递归出口n==0靠近
注意:
1.递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
2.在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。
多个参数的递归示例:
斐波那契数列:就是前两个数的和为后一个数的值(0,1,1,2,3,5,8,13.........)
def foo(arg1,arg2,stop): if arg1 == 0: print(arg1,arg2) arg3 = arg1 + arg2 print(arg1,arg2,arg3) if arg3 < stop: #判断套件不满足时退出递归 foo(arg2,arg3,stop) #递归函数,传送参数arg2,arg3,stop给arg1,arg2,stop foo(0,1,50)
将输入的字符串倒序打印,递归和非递归比较示例:
#非递归方法一
w=raw_input("请输入字符串:")
a=""
for i in range (1,len(w)+1):
a=a+w[-1]
w=w[0:-1]
print a
#非递归方法二
w=raw_input("请输入字符串:")
print w[::-1]
#递归
w=raw_input("请输入字符串:")
def q(a,b):
if b==1:
return a[0]
else:
m=a[-1]
a=a[0:-1] #去掉字符串的最后一个字符
return m+q(a,b-1) #最后一个字符不断累加
print q(w,len(w))