斐波那契数列python循环算法求解_Python算法 - 递归精解 - 斐波那契数列问题

递归原理

形式 - 函数内部调用函数本身

递 - 函数之间的传递参数

归 - 自动完成

终止 - 递归停止的条件

斐波那契数列

1450319-20200330161548260-650804259.png

此案例可以延申很多。 类似兔子繁殖问题, 上楼梯问题等等

递归的方式实现

递归的方式是逆向的, 往后递归倒最底层的 1+1 上再一层一层返回到低 k 层上的进行累加

原理图示

1450319-20200331103623138-717507492.png

1450319-20200331104251357-296111632.png

递的过程中, 相当于把任务分级, f3 因为 达到终止条件后 计算得到 2, 于是才有精力在计算 f2

1450319-20200331104526831-1196186924.png

1450319-20200331104639331-410623575.png

于是基于此流程再依次重复计算 f3, f4

1450319-20200331110857281-531065054.png

由此可见里面存在大量的重复计算的过程, 而且重复的次数随着k的增加会更快程度的增加

而非递归的方式就不会有这种问题, 不论 k 你怎么取时间都较为稳定

代码实现

#1 1 2 3 5 8 13 21 ....

deffib_test(k):#求解第 k 个数的值

assert k > 0, u"k 必须大于0"

if k in [1, 2]:return 1

return fib_test(k - 1) + fib_test(k - 2)if __name__ == '__main__':print fib_test(5) #5

print fib_test(7) #13

非递归的方式实现

非递归方式是正向, 从1+1 开始通过更新 k-1 和 k-2 实现

代码实现

#1 1 2 3 5 8 13 21 ....

deffib_test(k):#求解第 k 个数的值

assert k > 0, u"k 必须大于0"

if k in [1, 2]:return 1k_1= 1k_2= 1

for i in range(3, k+1):#便于理解的形式

#tmp = k_1

#k_1 = k_1 + k_2

#k_1 = tmp

k_1, k_2 = k_1 +k_2, k_1returnk_1if __name__ == '__main__':print fib_test(6) #8

print fib_test(7) #13

斐波那契问题其他类型 - 爬楼梯

1450319-20200331111913196-1907486610.png

反向思考, 对于最后一层台阶来说, 有几种可能性爬上来?

1. 从倒数第二层台阶(k-1) 爬一级到最后一层台阶

2. 从倒数第三层台阶(k-2) 爬两级到最后一层台阶

同理对于倒数第二层台阶来说, 有几种可能性爬上来?

1. 从倒数第三层台阶(k-1) 爬一级到最后一层台阶

2. 从倒数第四层台阶(k-2) 爬两级到最后一层台阶

由此可见还是满足公式

f(k) = f(k-1) + f(k-2) 爬上每一层台阶的可能性等于前一层和前两次的可能加和

且 f(1) = 1 f(2) = 1 倒数第二和倒数第三爬到最后一层的可能性都为 1

斐波那契问题其他类型 - 生兔子

1450319-20200331112153323-1120434195.png

1 2 (1月兔) = 2

2 2 (1月兔) = 2

3 2 (1月兔) + 2(1月兔生- 3月兔) = 4

4 2 (1月兔) + 2(3月兔) + 2(1月兔生- 4月兔) = 6

5 2 (1月兔) + 2(3月兔) + 2(4月兔) + 2(1月兔生- 5月兔) + 2(3月兔生- 5月兔) =8

6 ......

上述规律可以看出, f(k) = f(k-1) + f(k-3) 因为是一对兔子生一对兔子

所以每个月的增量都应该是前前一个月的兔子数量 (兔子隔月生)

且满足 f(1) = 2 , f(2) = 2, 初始只有一对兔子, 第二个月每生出来也只有一对兔子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值