问题是:你正在爬楼梯。它需要n步才能达到顶峰。 每次你可以爬1或2步。您可以通过多少不同的方式登顶?
我看到了一个正确的java代码,但我不理解逻辑。有谁可以向我解释一下?什么是a,b,c的立场?
public int climbStairs(int n) {
if (n<2) return 1;
int a = 1;
int b = 1;
int c = 1;
for (int i=2; i<=n; i++){
c = b;
b = a + b;
a = c;
}
return b;
}
答案 0 :(得分:1)
代码本身基本上是一个斐波那契数字生成器。
int a = 1;
int b = 1;
int c = 1;
for (int i=2; i<=n; i++){
c = b;
b = a + b;
a = c;
}
创建n
斐波纳契数,从n = 0
开始为1。
更重要的问题是:
可能的方式数量如何与斐波纳契行相对应?
对于n = 0
和n = 1
,答案非常简单:只有一种方法:不要移动(0),只需一步(1)。对于任何其他n
,我们可以使用递归方法:有两种方法可以达到步骤n
:从n - 1
开始一小步或从n - 2
开一步。这与斐波纳契序列相同:fib(n + 2) = fib(n + 1) + fib(n)
。
答案 1 :(得分:0)
递归公式是
f(n) = f(n-1) + f(n-2)
f(0) = f(1) = 1
在代码
中翻译为a, b, c
if (n<2) return 1;
int a = 1;
int b = 1;
int c = 1;
以上定义f(0) = f(1) = 1
及以下f(n) = f(n-1) + f(n-2)
n >= 2
for (int i=2; i<=n; i++){
c = b; // f(i-1) is temporary saved in c
b = a + b; // f(i-2) + f(i-1) is saved in b
a = c; // f(i-1) is saved in a for the next iteration
}