10个台阶,每次只能上1个或者2个,一共有多少种走法

本文介绍了两种解决爬楼梯问题的方法:递归法和排列组合法。递归法利用数学归纳法的思想,将大问题分解为子问题求解;排列组合法则通过组合数学原理计算所有可能的走法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路来得太慢,好想拿小锤锤捶自己哟~~~

 

第一种,递归思路。

如果你上10个台阶,可以分解成下面两种情况:

● 上9个台阶,最后上1个台阶。假设这种情况下,上前面9个台阶的方法数为m。

● 上8个台阶,最后上2个台阶。假设这种情况下,上前面8个台阶的方法数为n。

所以,上10个台阶的方法数,其实就是 m + n。

可以递归为:

f(n) = f(n - 1) + f(n - 2),   n > 2

f(n) = 2                      ,   n = 2

f(n) = 1                       ,   n = 1

 

    private static int step(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        else return step(n - 1) + step(n - 2);
    }

 

 

 

 

 

第二种,排列思路。

10个台阶,全部都走两步的话,无非就是5个两步。

● 全是一步,10个一步。1种。

● 1个两步,8个一步。相当于从9个坑里放1个两步。9C1 = 9种。

● 2个两步,6个一步。相当于从8个坑里放2个两步。8C2 = 28种。

● 3个两步,4个一步。相当于从7个坑里放3个两步。7C3 = 35种。

● 4个两步,2个一步。相当于从6个坑里放4个两步。6C4 = 15种。

● 5个两步。1种。

所以一共有:1 + 9 + 28 + 35 + 15 + 1 = 89种。

 

 

<think>嗯,用户问的是用Java求解100个台阶每次可以走1或者2步,有多少种方式。首先,我需要回忆下这类问题的解法。这应该是个经典的动态规划问题,类似于斐波那契数列的变种。 首先,确认问题:每次可以走12步,到第n个台阶多少走法。假设n=1的时候只有1种方式,n=2的时候有两种(1+1或者2),n=3的时候应该是n=1的方式加上n=2的方式,也就是1+2=3种。这看起来确实是斐波那契数列的规律,即f(n) = f(n-1) + f(n-2)。 不过用户提到的是100个台阶,这时候直接用递归的话会有大量的重复计算,导致效率极低,甚至栈溢出。所以必须用动态规划来优化。应该用迭代的方式,从底向上计算,保存中间结果。 然后,考虑数据范围的问题。斐波那契数增长很快,到n=100的时候,数值会非常大,普通的整数类型可能会溢出。比如Java的int只能2^31-1,而long也只能2^63-1。计算下f(100)的值有多大。根据斐波那契数列的性质,f(n)大约等于(φ^n)/√5,其中φ是黄金分割比约1.618,所以f(100)大概是1.618^100 /√5,这个数显然超过了long的范围。因此,必须使用大数类型,比如Java中的BigInteger。 接下来,如何实现这个动态规划算法。初始化两个变量,a和b,分别代表f(n-2)和f(n-1),然后从2开始循环到n,每次更新a和b的值,直到计算出f(n)。对于n=100的情况,循环98次即可。 再考虑边界条件,当n=0时可能为0或者1,但题目中的台阶应该从1开始,但可能需要确认n=0的情况。不过根据问题描述,n=11种,n=22种,所以应该从n>=1开始处理。 然后编写代码,使用BigInteger来存储中间结果,避免溢出。例如,初始化a=BigInteger.ONE(f(1)=1),b=BigInteger.ONE(f(2)=1?这里可能有问题,需要再仔细核对)。或者可能初始条件应该为a=1(n=1),b=2(n=2),然后从3开始循环到n。可能我之前搞错了初始条件,需要重新确认。 比如,当n=1时,只能1步,1种方式;n=2时,1+12,两种方式;n=3时,f(3)=f(2)+f(1)=2+1=3;所以正确的初始条件应该是当n=1时返回1,n=2返回2。所以动态规划的初始值应该是a=1(f(1)),b=2(f(2)),然后从3到n循环,每次计算c=a+b,然后a=b,b=c。这样循环到n次。这样对于n=100,需要循环98次。 另外,当n=0的时候,可能有不同的定义,但这里应该不需要考虑,因为台阶数从1开始。 所以代码的大致结构应该是: public static BigInteger countWays(int n) { if (n <= 0) return BigInteger.ZERO; if (n == 1) return BigInteger.ONE; if (n == 2) return BigInteger.TWO; BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.TWO; for (int i = 3; i <= n; i++) { BigInteger c = a.add(b); a = b; b = c; } return b; } 然后测试下这个函数是否正确,比如n=3返回3,n=4返回5,n=5返回8,符合斐波那契数列的规律。这时候,当n=100时,这个函数会返回正确的大数结果。 不过用户的问题可能希望得到具体的数值,所以需要计算结果。计算f(100)的值是多少呢?根据斐波那契数列,第100项的值是573147844013817084101,对吗?或者可能初始条件不同导致结果偏移。比如斐波那契数列通常定义为f(0)=0, f(1)=1,但这里的问题中,n=1对应的是f(1)=1,n=2是f(2)=2,所以实际这里的问题对应的斐波那契数列是从f(1)=1, f(2)=2开始的,因此第100项对应的其实是斐波那契数列的第101项,因为通常斐波那契数列的索引从0开始。所以需要确认正确的数值。 或者可能更简单地说,这里的数列是斐波那契数列的位移,例如f(n) = Fib(n+1),其中Fib是标准的斐波那契数列。例如,当n=1时,Fib(2)=1,n=2时Fib(3)=2,n=3时Fib(4)=3,依此类推。因此,对于n=100,结果应该是Fib(101)项。标准斐波那契数列的第100项是354224848179261915075,而第101项是573147844013817084101,所以用户的问题的解应该是这个数值。 所以,当用户输入n=100时,结果是573147844013817084101种方式。 最后,将这些思考整理成个清晰的回答,解释问题背后的数学原理,动态规划的解法,以及为什么使用BigInteger,并给出Java代码示例,同时指出结果的具体数值。</think>**Java求解100级台阶走法问题(每次12步)** --- **数学模型** 问题本质是**斐波那契数列**的变形: - 递推公式:$f(n) = f(n-1) + f(n-2)$ - 边界条件: $f(1)=1$(只能1步) $f(2)=2$(1+1或直接2步) --- **算法选择** 1. **递归法**(不推荐): 时间复杂度 $O(2^n)$,n=100时完全不可行 2. **动态规划**(推荐): 时间复杂度 $O(n)$,空间复杂度 $O(1)$ --- **Java实现代码** ```java import java.math.BigInteger; public class Staircase { public static BigInteger countWays(int n) { if (n <= 0) return BigInteger.ZERO; if (n == 1) return BigInteger.ONE; if (n == 2) return BigInteger.valueOf(2); BigInteger a = BigInteger.ONE; // f(n-2) BigInteger b = BigInteger.valueOf(2); // f(n-1) for (int i = 3; i <= n; i++) { BigInteger temp = a.add(b); a = b; b = temp; } return b; } public static void main(String[] args) { int stairs = 100; System.out.println("总方式数:" + countWays(stairs)); } } ``` --- **关键点说明** 1. **大数处理**: 使用 `BigInteger` 避免整数溢出,因为 $f(100) = 573147844013817084101$ (对比:Long最大值仅 $9,223,372,036,854,775,807$) 2. **计算验证**: | 台阶数 | 结果验证 | |--------|-------------------| | 3 | 3(1+1+1,1+2,2+1)| | 4 | 5 | | 5 | 8 | --- **数学推导** 通过特征方程 $x^2 = x + 1$ 得通项公式: $$ f(n) = \frac{\phi^{n+1} - \psi^{n+1}}{\sqrt{5}}, \quad \phi=\frac{1+\sqrt{5}}{2}, \psi=\frac{1-\sqrt{5}}{2} $$ 但实际编程中迭代法更高效。 --- **运行结果** 当 n=100 时,共有: **573147844013817084101** 种走法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值