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 斐波那契/跳台阶一步两步/跳台阶多种步法/配零钱相关推荐

  1. python斐波那契数列前20项_Python每日一练之实现斐波那契数列

    概述 今天主要分享下怎么用Python实现斐波那契数列,大家有空可以玩一下~ 需求 用Python脚本实现斐波那契数列. 思路 斐波那契数列,也称兔子数列,是指1,1,2,3,5,8,13,21,34 ...

  2. python斐波那契递归_Python递归斐波那契示例

    python斐波那契递归 Good day, learners! In this tutorial we are going to learn about Python Recursion and u ...

  3. python程序题斐波那契数列通项公式,Python斐波那契数列应用,编程练习题实例六...

    python斐波那契数列,本文是关于Python编程练习题和答案实例六,斐波那契数列应用的示例.引用百度关于斐波那契数列的介绍,大家先简单来的了解下,什么是斐波那契数列? 斐波那契数列(Fibonac ...

  4. 剑指 Offer 10- I. 斐波那契数列/剑指 Offer 10- II. 青蛙跳台阶问题

    2020-07-02 1.题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少 ...

  5. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

  6. python 斐波那契数列 yield_Python中的yield到底是个什么鬼?

    Python大数据分析 记录 分享 成长 相信你已经不止一次在函数中看到关键词,它起着什么作用?返回什么?和又有着什么区别呢?这篇文章将会揭开的神秘面纱,并给出最浅显易懂的例子. 关键字做了什么? 如 ...

  7. Python数学计算工具3、Python 斐波那契数列-前500项列表

    百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  8. python斐波那契数列前20项_Python初学者笔记:打印出斐波那契数列的前10项

    问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...

  9. python斐波那契数列

    转自:https://www.cnblogs.com/wolfshining/p/7662453.html 斐波那契数列即著名的兔子数列:1.1.2.3.5.8.13.21.34.-- 数列特点:该数 ...

最新文章

  1. 快速创建Angular组件并定义传参、绑定自定义事件的方法
  2. 平均 15189 元!2021 年 3 月程序员工资统计出炉
  3. PHP生成随机或者唯一字符串
  4. 二十五:设计模式的总结
  5. 怎样实现关闭connection时自动关闭Statement和ResultSet
  6. java中的内存一般分成几部分?
  7. mysql抽屉图标_React Native自定义组件实现抽屉菜单控件效果
  8. Github分支管理范例
  9. python中或语句_python判断语句怎么写
  10. 豆瓣电影评论情感分析(含代码+数据)
  11. 免费WEB打印控件(插件)——打天下
  12. poi XWPFDocument文档转换成io流
  13. Python格式化新年祝福语
  14. 检测xposed框架实现
  15. 图像运算和图像增强一
  16. 上位机plc编程入门_【新手入门】西门子PLC编程入门学习
  17. 李宏毅老师《机器学习》课程笔记-3卷积神经网络
  18. 中文分词之HMM详解
  19. android 自定义饼图半径不定,【Android】仿支付宝账单统计饼状图的自定义view
  20. 码出高效:java开发手册_Java 11手册:Java专家分享他们在Java 11方面的最佳和最差的经验

热门文章

  1. 可扩展标记语言XML
  2. Linux内核总线系统 —— 通用总线和平台设备
  3. Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
  4. 【UE4 第一人称射击游戏】13-瞄准开火
  5. VS MFC Dlg
  6. 深入理解CDC原理与Debezium数据接入流程和原理
  7. AnotherRedisDesktopManager
  8. 每日一面 - MySQL 的双一设置是什么?
  9. 皮尔森相关性系数的计算python代码(四)(热力图版)
  10. ava的HashCode方法