`
jlj008
  • 浏览: 97003 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

爬楼梯上台阶可能性的算法

 
阅读更多
问题大致是这样的:50格楼梯,每次可以上1个或2个台阶,问爬完楼梯方法的可能性有几种。
答:简单的递归可以算出,但是时间复杂度是指数级的;好的做法是可以在递归中,把中间结果缓存起来,这样可以避免递归中的重复计算,提高了运算速度,该算法复杂度是线性级的o(n)。

/*
 * There are a certain number of steps of a stair, one can be up stair
 * by 1 step or 2 steps for each time. How many possibilities one can
 * go up stairs?
 * 
 * Answer, if only using recursion, the time complex is index grade while
 * catching each middle result changes it to linear grade.
 */
package com.algo;

public class Stairs {

	long[] results;
	
	public long calculateApproaches(int stairCount) { // 1 - 50
		if (results == null) results = new long[stairCount];
		
		if (stairCount < 0) return 0;
		if (stairCount == 0) return 1;
		
		if (results[stairCount - 1] != 0) return results[stairCount - 1];
		
		long temp = 0;
		if (stairCount == 1) {
			temp = 1;
		} else {
			temp = calculateApproaches(stairCount - 1) + calculateApproaches(stairCount - 2);
		}
		
		results[stairCount - 1] = temp;
		
		return temp;
	}
	
	public static void main(String[] args) {
		System.out.println("n=1 : " + new Stairs().calculateApproaches(1));
		System.out.println("n=2 : " + new Stairs().calculateApproaches(2));
		System.out.println("n=3 : " + new Stairs().calculateApproaches(3));
		System.out.println("n=4 : " + new Stairs().calculateApproaches(4));
		System.out.println("n=5 : " + new Stairs().calculateApproaches(5));
		System.out.println("n=6 : " + new Stairs().calculateApproaches(6));
		System.out.println("n=40 : " + new Stairs().calculateApproaches(40));
		System.out.println("n=50 : " + new Stairs().calculateApproaches(50));
	}
	
}
分享到:
评论

相关推荐

    c语言爬楼梯回溯算法

    下面我们将深入探讨回溯算法的概念、应用场景以及如何用C语言来实现爬楼梯问题。 回溯算法主要应用于解决组合优化问题,如八皇后问题、迷宫求解、图的着色问题等。其核心特点是通过递归或迭代的方式遍历所有可能的...

    迭代应用-上台阶诶算法

    算法的基本设定是:一只猴子在地面上,想要爬到一个有N级台阶的楼梯顶端。每次它可以跳一级或者两级。任务是找出到达顶峰的所有可能方式。这个问题的核心在于计算在每一步后到达顶峰的方法数量。 我们首先可以从最...

    阶梯 问题

    某人上楼梯,他一步可以迈一个台阶,两个台阶或三个台阶,共有n个台阶,编程输出他所有可能上法。如:有4个台阶,输出应是: 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1 算法设计: 给定台阶的个数n,输出所有可能的上法...

    青蛙爬楼梯(C++源码)

    压缩包中的"青蛙爬楼梯"很可能包含了这段C++源码和编译后的可执行文件。用户可以直接运行这个EXE文件,输入台阶数,程序会自动计算并显示跳法总数。这种方法使得非程序员也能方便地使用这个程序。 总的来说,“青蛙...

    电信设备-带有导臂的履带式移动机器人的攀爬楼梯控制方法.zip

    在攀爬楼梯时,导臂可能用于提供额外的支撑、平衡或抓取能力,帮助机器人在台阶上稳定自身。 3. **楼梯攀爬控制算法**:控制机器人攀爬楼梯需要精确的运动规划和控制算法。这可能涉及到对机器人每个部分(如履带、...

    电动智能爬楼梯轮椅三维图.rar

    9. **兼容性与互连性**:现代电动智能爬楼梯轮椅可能支持蓝牙或Wi-Fi连接,能与其他智能设备(如智能手机或智能家居系统)集成,方便用户远程控制或获取设备状态信息。 10. **法规与标准**:此类设备需要满足相关...

    js代码-200602-变态跳台阶

    标题“js代码-200602-变态跳台阶”和描述中提到的“js代码-200602-变态跳台阶”显然指的是一个JavaScript编程问题,可能是一个编程挑战或者算法练习,其中“变态跳台阶”可能是对问题的具体描述。这种问题通常涉及到...

    PASCAL递归与回溯算法PPT教案.pptx

    接下来,我们讨论爬楼梯问题。这个问题同样可以用递归来解决。如果楼梯有n个台阶,可以一次走1阶或2阶,递归公式可以表示为: ```markdown f(n) = f(n-1) + f(n-2) ``` 这里的f(n)表示n阶楼梯的不同走法数。基础...

    履带机器人爬楼分析.doc

    履带部分需要具有足够的抓地力,同时能够适应楼梯台阶的宽度和高度变化。可能需要特殊的关节或伸缩机构来调整机器人的履带间距和高度,确保在楼梯上稳定行走。 2. **动力系统**:为了提供爬楼所需的驱动力,机器人...

    Java Methods-Algorithms and Recursion.ppt

    以爬楼梯为例,基础情况是无台阶可爬,递归情况是每一步都向上爬一阶,然后对剩余的台阶递归地应用这个过程。 下面是一个使用递归计算整数平方和的Java方法示例: ```java public class MyMath { public static ...

    电信设备-具有轮-腿-履带复合移动机构的危险作业机器人.zip

    腿式设计则赋予了机器人攀爬和越障的能力,能够应对楼梯、台阶或破损路面等挑战。履带式结构则为机器人在沙地、泥泞或松软地面提供更好的牵引力和稳定性。这种复合移动机构使得机器人能够在各种复杂环境中自主导航,...

    动态规划?Yes!DPs

    除了小羊头接苹果的问题,动态规划还可以应用于许多其他问题,如爬楼梯问题。设f[i]为爬到i阶楼梯的方案数,根据状态转移,我们有f[i] = f[i - j] (1 (i, m)),其中m是每次可以跨越的台阶数。最后,f[n]就是问题的...

    数学运算题分类训练和解答知识.pdf

    2. **运用经验法**:在实际问题中,如种树、爬楼梯等,需要结合生活常识来解决问题,如种树时要考虑起点的一棵树,计算楼梯台阶时要考虑一层没有楼梯。 3. **设未知数法**:在解决年龄、人数等实际问题时,可以通过...

    LeetCode练习答案

    - **爬楼梯(Climbing Stairs)**: 每次可以爬1或2个台阶,求出爬上n阶楼梯的不同方法数。 ##### 回溯(Backtracking) - **组合(Combination)**: 给定两个整数n和k,返回所有可能的k个数的组合,这些数是从1到n中选取...

    _leetcode-python.pdf

    - Climbing Stairs: 假设你正在爬楼梯,需要n步你才能到达楼顶。每次你可以爬1或2个台阶。计算有多少种不同的方法可以爬到楼顶。 - Simplify Path: 给定一个表示文件系统的路径,请实现一个方法,以简化这个路径。 -...

    LeetCode解题总结

    1.13 爬楼梯 1.14 格雷码 1.15 设置矩阵的行列为0 1.16 加油站问题 1.17 分糖果 1.18 只出现一次的数 2. 单链表 2.1 单链表相加 2.2 指定位置反转单链表 2.3 依据给定值将链表重新排序 2.4 删除链表中重复元素 2.5 ...

Global site tag (gtag.js) - Google Analytics