算法之递归

何时用递归

需满足三个条件:

  1. 一个问题的解可以分解为几个子问题的解
  2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  3. 存在递归终止条件

使用递归时注意要点

  1. 要注意避免堆栈溢出
  2. 要注意不要过量的重复性计算(可以利用map存储计算值)

递归与迭代的区别

  • 递归是函数调用函数自身
  • 迭代是变量自身的数值变化

简单例子

问题:假如现在有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这n个台阶有多少种走法?

解答:这个问题可以分解为,n个台阶的走法等于跨了一个台阶之后的台阶的走法加上跨了两个台阶之后的走法。用函数表示的话,就是 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2)。那么,终止条件是什么呢?

有两个,当n为1时, f ( 1 ) = 1 f(1)=1 f(1)=1,当n为2时, f ( 2 ) = 2 f(2)=2 f(2)=2

满足上面所述的使用递归所要具备的三个条件,接下来就转换为代码就行了。

def main():
        n = input()
        print(f(n))

def f(n):
        s = {}
        if n == 1:
                return 1
        if n == 2:
                return 2
        if n in s.keys():
                print(n)
                return s[n]
        ret = (f(n-1) + f(n-2))
        if n not in s.keys():
                s[n] = ret

        return ret

main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值