递归

递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推
回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯
 
什么是递归?
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))
 
 
原文地址:https://www.cnblogs.com/myshuzhimei/p/11756139.html