Python 斐波那契/跳台阶一步两步/跳台阶多种步法/配零钱
Python3.6.3
跳台阶一步两步
1. 跳n(n∈N)阶台阶过程中最多有 n//2 步是跳了2阶,2阶步数固定的情况下可以用 C(总步数, 2阶的步数) 求出方法数,再把所有情况都加起来即可。
from math import factorial
from functools import reduce
from scipy.special import comb # C(N, k)def f1(n): # sum(C(总步数, n2) for n2 in range(max2)) # max2:2步的数量最大值return sum(comb(n-n2, n2, exact=True) for n2 in range(n//2 + 1)) # 速度比下一句快一个量级# return sum(reduce(lambda a, b: a*b, range(n2+1, n-n2+1) or [1]) // factorial(n- 2*n2) for n2 in range(n//2 + 1))
2. 动态规划:假设n(n∈N)阶台阶的跳法数为F(n),最后一步要么跳了2阶(前面跳了n-2个台阶,方法数为F(n-2) (n>=2) ),要么跳了1阶(前面跳了n-1个台阶,方法数是F(n-1) ),所以
F(n) = F(n-1) + F(n-2) (n∈N,n>=2) ,
显然:
F(0) = 1,F(1) = 1 。
其实就是斐波那契数列(斐波那契数列通项公式中有无理数,用程序计算结果当n大于70时开始有误差,故不使用通项公式求法)。
关于F(0)=1: F(n)表示的是跳n阶台阶方法的数量,而不是跳了多少步。跳0阶,方法就是不跳,这是一个方法!(当然不同人不同看法,对程序影响其实不大)
斐波那契从前向后:
def f2(n): # 1stif n < 2:return 1n0, n1 = 1, 1for _ in range(n-1):n0, n1 = n1, n0+n1return n1
斐波那契从后向前 n<=1996(与递归深度限制有关):
def f3(n, cache=None): # 2stcache = cache or {0: 1, 1: 1} # 默认值为可变类型的参数t = cache.get(n)if t is not None: return t # 两个get不简化可以省空间,简化了省时间cache[n-2] = f3(n-2, cache) # Python有递归深度限制,先算n-2比先算n-1能计算更大的ncache[n-1] = f3(n-1, cache) # 两个赋值分开写比合着能计算的n可能更大(大1,也可能不大,因为最后一层可能是n-2,n-1都到边界也可能只有n-2到边界(与递归深度和边界有关))return cache[n-1] + cache[n-2]
检验:
def _test():for n in range(500):funcs = (f1, f2, f3)res = {f(n) for f in funcs}if len(res) != 1:print(n, [f(n) for f in funcs])breakprint(n, res.pop())else:print(True)if __name__ == '__main__':_test()
n阶台阶,每次可以跳1阶、2阶、3阶、...、n阶
同样考虑最后那一步有n种情况,得到:
F(n) = F(n-1) + F(n-2) + F(n-3) + ... + F(n-n)
= F(0) + F(1) + F(2) + ... + F(n-1) (n∈N*) ①
所以:
F(n-1) = F(0) + F(1) + F(2) + ... + F(n-2) (n∈N,n>=2) ②
① - ② 得:
F(n) = 2·F(n-1) (n∈N*,n>=2) ③
显然:
F(0) = F(1) = 1
所以:
不建议在③步就用递归或从前向后的解法,那属于数列没学好的做法,明明有更简单的通项公式为什么不用呢,如果这是高中求数列的题,到③就结束,保证你被数学老师一顿乱k
import mathf = lambda n: 2**((n or 1)-1)
# f = lambda n: 2**(n-1) if n else 1
# f = lambda n: math.ceil(2**(n-1)) # 一样快
n阶台阶,每次可以跳1、2、... 、k阶
n阶台阶,每次可以跳m0, m1, m2, ..., mk阶
用零钱凑成n元,零钱有足够量的1、2、5、10、20、50、100元面值
Python 斐波那契/跳台阶一步两步/跳台阶多种步法/配零钱相关推荐
- python斐波那契数列前20项_Python每日一练之实现斐波那契数列
概述 今天主要分享下怎么用Python实现斐波那契数列,大家有空可以玩一下~ 需求 用Python脚本实现斐波那契数列. 思路 斐波那契数列,也称兔子数列,是指1,1,2,3,5,8,13,21,34 ...
- python斐波那契递归_Python递归斐波那契示例
python斐波那契递归 Good day, learners! In this tutorial we are going to learn about Python Recursion and u ...
- python程序题斐波那契数列通项公式,Python斐波那契数列应用,编程练习题实例六...
python斐波那契数列,本文是关于Python编程练习题和答案实例六,斐波那契数列应用的示例.引用百度关于斐波那契数列的介绍,大家先简单来的了解下,什么是斐波那契数列? 斐波那契数列(Fibonac ...
- 剑指 Offer 10- I. 斐波那契数列/剑指 Offer 10- II. 青蛙跳台阶问题
2020-07-02 1.题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少 ...
- python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...
经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...
- python 斐波那契数列 yield_Python中的yield到底是个什么鬼?
Python大数据分析 记录 分享 成长 相信你已经不止一次在函数中看到关键词,它起着什么作用?返回什么?和又有着什么区别呢?这篇文章将会揭开的神秘面纱,并给出最浅显易懂的例子. 关键字做了什么? 如 ...
- Python数学计算工具3、Python 斐波那契数列-前500项列表
百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- python斐波那契数列前20项_Python初学者笔记:打印出斐波那契数列的前10项
问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...
- python斐波那契数列
转自:https://www.cnblogs.com/wolfshining/p/7662453.html 斐波那契数列即著名的兔子数列:1.1.2.3.5.8.13.21.34.-- 数列特点:该数 ...
最新文章
- 快速创建Angular组件并定义传参、绑定自定义事件的方法
- 平均 15189 元!2021 年 3 月程序员工资统计出炉
- PHP生成随机或者唯一字符串
- 二十五:设计模式的总结
- 怎样实现关闭connection时自动关闭Statement和ResultSet
- java中的内存一般分成几部分?
- mysql抽屉图标_React Native自定义组件实现抽屉菜单控件效果
- Github分支管理范例
- python中或语句_python判断语句怎么写
- 豆瓣电影评论情感分析(含代码+数据)
- 免费WEB打印控件(插件)——打天下
- poi XWPFDocument文档转换成io流
- Python格式化新年祝福语
- 检测xposed框架实现
- 图像运算和图像增强一
- 上位机plc编程入门_【新手入门】西门子PLC编程入门学习
- 李宏毅老师《机器学习》课程笔记-3卷积神经网络
- 中文分词之HMM详解
- android 自定义饼图半径不定,【Android】仿支付宝账单统计饼状图的自定义view
- 码出高效:java开发手册_Java 11手册:Java专家分享他们在Java 11方面的最佳和最差的经验