Java动态编程“爬楼梯”,不懂逻辑

时间:2016-04-06 19:09:09

标签: java algorithm dynamic-programming fibonacci

问题是:你正在爬楼梯。它需要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;
}

2 个答案:

答案 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 = 0n = 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
}