zoukankan      html  css  js  c++  java
  • 递归

    递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推
    回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯
     
    什么是递归?
    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))
     
     
  • 相关阅读:
    定制一个支持中英文的简单LaTex模板
    汉字hash问题(转)
    算法题之最大回文子串
    算法题之添加回文串
    数据表设计的步骤
    很简单的Java断点续传实现原理
    MongoDB 搭建文件存储的方案
    cron语法
    关于如何使用SVN的一些建议
    无后台应用 Stash Backend
  • 原文地址:https://www.cnblogs.com/myshuzhimei/p/11756139.html
Copyright © 2011-2022 走看看