首页 > 技术文章 > python-递归

liucheng224 2021-02-04 10:40 原文

一、斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34
思路:
n位的数等于n-1位和n-2位数之和
使用递归,结束条件n=0和n=1

def f(n):
      if n==0:
            return 0
      if n==1 or n==2:
            return 1
      return f(n-1)+f(n-2)

优化方案,利用字典,来存放计算过的数据

def f(n):
      s={}
      def f1(n):
            if n in s:
                  return s[n]
            else:
                  if n<=2:
                        result=n
                  else:
                        result=f1(n-1)+f1(n-2)
                  s[n]=result
                  return result
       return f1(n)

二、阶乘
利用递归方法求5!。
思路:n! = n*(n-1)!
def f(n): if n==0: return 0 if n==1 or n==2: return 1 return n*f(n-1)
三、生兔子问题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
思路:
实际也是斐波那契数列 n个月的兔子数量等于n-1个月的兔子数量+n-2个月的兔子数量
def f(n): if n==1 or n==2: return 1 return f(n-1)+f(n-2)
四、青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
思路:
斐波那契数列问题 跳上n级的方法由跳上n-1级和n-2级方法之和
def f(n): if n==1: return 1 if n==2: return 2 return f(n-1)+f(n-2)
缺点:n大时耗时严重
后续需要优化

五、反转字符串
思路:
循环调用
结束条件 字符串长度为0

def f(n,l):
      if l==0:
            return
      print(n[l-1])
      f(n,l-1)
def f(n):
      def f1(n,i,j):
            if i>j:return n
            else:
                  n[i],n[j]=n[j],n[i]
            return f1(n,i+1,j-1)
      return f1(n,0,len(n)-1)

推荐阅读