首页 > 编程语言 >算法题:跳房子问题(爬楼梯问题进阶) 求解受限制情况下的方案数目

算法题:跳房子问题(爬楼梯问题进阶) 求解受限制情况下的方案数目

时间:2023-11-12 16:35:57浏览次数:44  
标签:status 跳房子 elif return 进阶 台阶 __ 爬楼梯

问题

跳房子,规定总共有n个格子,每次可以选择跳1个格子、2个格子或3个格子,但是下一步不能和当前选择的跳跃距离一样,计算总共有多少种跳房子方案。

分析

这就是经典爬楼梯问题的进阶,仅仅换了个说法,但是比经典的爬楼梯问题难了不少,传统的爬楼梯问题一次可以上1或2个台阶没有连续动作选择的限制,核心解法是可以列出一个斐波那契数列,\(f(n) = f(n-1) + f(n-2)\),递归的2个特殊终止条件是\(f(1)=1,f(2)=2\)。

参考

https://zhuanlan.zhihu.com/p/357915526

上面是我参考的做法,它只限制不能连续爬2个台阶而且没有连续跨越3个台阶的选择,它给\(f(n,status)\)函数中额外添加一个参数status,表示从第n个台阶跨status个台阶(因此到达\(f(n,status)\)的前一次跨越不能跨status个台阶)。当status设置为0时是程序代码入口,表示可以从第n-1、n-2或n-3个台阶分别攀爬到第n个台阶。

Python3代码

# 求攀爬方案的总数目:             
# 1. 共有n个台阶            
# 2. 每次可以向上爬1、2或3个台阶
# 3. 相邻的下一次不能和本次攀爬的台阶数相同

def F(N, status):
    if N < 0:
        return 0
    elif N == 0:    # status is 1 2 or 3 没有任何限制 因为这必定是爬台阶的第一步,没有之前步骤长度的限制
        return 1
    elif N == 1:
        if status == 1:
            return 0
        else:           # status is 2 or 3
            return 1
    elif N >= 2:
        if status == 0:
            return F(N-1,1) + F(N-2,2) + F(N-3,3)
        elif status == 1:
            return F(N-2,2) + F(N-3,3)
        elif status == 2:
            return F(N-1,1) + F(N-3,3)
        elif status == 3:
            return F(N-1,1) + F(N-2,2)
            

if __name__ == '__main__':
    n = 5
    print(f"When n = {n},F numbers: {F(n, 0)}")
            

执行效果:

验证上述结果

代码以\(n=5\)个台阶为例做测试,爬楼方案和算法伪代码如下图所示

千万要注意递归算法的边界条件:n为负数、0或1的时候。

  • 若n为负数,是不合理的,例如\(f(-1,status=3)\)渴望从-1一次爬3个台阶到2,是无解的,因此\(f(n<0,status)=0\)。
  • 若n为0,无论\(status\)值为1、2或3,值都为1;这正是爬楼者在起点最初始的选择,选择不受历史的限制(因为这就是最最最开头,没有历史)。
  • 若n为1,注意\(f(1,1)\)不合理,值为0,因为0=>1=>2是连续爬1个楼梯的不满足规则;\(f(1,2)=f(1,3)\)都是合理的,值为1,分别代表了0=>1=>3和0=>1=>4的爬楼梯顺序。

标签:status,跳房子,elif,return,进阶,台阶,__,爬楼梯
From: https://www.cnblogs.com/Higgerw/p/17827352.html

相关文章

  • .Net进阶(5)使用Fody实现 .NET的静态编织
    序言 广义的面向切面编程,有静态编织和动态代理两种形式,它们都可以在某个方法执行前后插入某种处理逻辑。不同的地方在于,前者发生在编译时期间,后者发生在运行时期间。对于.NET而言,最常见的静态编织方案是 PostSharp 和 Mono.Cecil,两者的区别是:一个付费、一个免费。本文介......
  • Android程序员自救进阶指南
    前言今天摸鱼的时候看到有人36岁在深圳开起了出租车的新闻,而且对方毕业于华南师范大学,曾在大厂当过主管,因为疫情而毕业,至今2年都没能回到主业,因为上有父母,下有孩子,需要养家糊口,不愿跑美团,认为没面子,所以开起了出租车。这话不得不再次刷新了我的三观,原来开出租车还能瞧不起跑外卖的......
  • ReactNative进阶(十):WebView 应用详解
    (文章目录)一、WebView组件介绍使用WebView组件可通过url来加载显示一个网页,也可以传入一段html代码来显示。下面对其主要属性和方法进行介绍。1.主要属性source:在WebView中载入一段静态的html代码或是一个url(还可以附带一些header选项);automaticallyAdjustCon......
  • 实力进阶,再攀高峰!触想智能获评国家级专精特新“小巨人”企业
    近日,触想智能收获工业和信息化部颁发的专精特新“小巨人”企业证书,成功跻身全国中小企业实力评优最高梯队。此项荣誉,不仅是国家权威对触想智能十余年潜心耕耘的深度回响,也进一步激发触想持续奋发、不懈探索的成长底气。触想智能专精特新“小巨人”企业证书专......
  • JMeter进阶使用变量及BeanShell 预处理程序实现复杂调试
    JMeter进阶使用变量及BeanShell预处理程序实现复杂调试有一些测试需要做一些预处理程序才能做http请求,在JMeter下可以通过使用参数+BeanShell预处理程序加工后再发起请求即可。例oauth服务需要通过username,password,client_id,client_secret,grant_type进行请求,这里的密码涉及安......
  • MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
    当涉及到MySQL数据库的进阶实战时,有许多方面需要考虑,包括性能优化、安全性、高可用性和复杂查询等。以下是一个关于MySQL数据库进阶实战的文章大纲,您可以根据需要进行扩展和详细说明。MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性引言MySQL是一款广泛使用的开源关系型数......
  • podman 容器管理 docker替代,进阶版本?
    简介Docker的一个缺点是它有一个中央守护进程,它以root用户的身份运行,这对安全有影响。但这正是Podman的用武之地。padman完全兼容docker命令和镜像。Podman是一个无守护进程容器引擎,用于开发、管理和在你的Linux系统上以root或无root模式运行OCI容器。安装安......
  • 前端开发进阶:前端开发中如何高效渲染大数据量?
    在日常工作中,有时会遇到一次性往页面中插入大量数据的场景,在数栈的离线开发(以下简称离线)产品中,就有类似的场景。本文将通过分享一个实际场景中的前端开发思路,介绍当遇到大量数据时,如何实现高效的数据渲染,以达到提升页面性能和用户体验的目的。渲染大数据量时遇到的问题在离线的数据......
  • 【python进阶】14大模块200页知识体系md笔记,第5篇:python下的linux命令使用
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套Python笔记直接地址:请移步这里共......
  • JavaScript进阶
    闭包闭包(closure)是一个函数以及其捆绑的周边环境状态(lexicalenvironment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在JavaScript中,闭包会随着函数的创建而被同时创建。<body><script>//闭包:内层函数+外层函数变量/......