Recursion 楼梯上的递归

Recursion 楼梯上的递归,recursion,dynamic-programming,Recursion,Dynamic Programming,我试图理解一本书中关于以下问题的解决方案: 一个孩子跑上n级楼梯,一次可以跳1级、2级或3级。实现一个方法来计算孩子可以跑上楼梯的可能方式 本书的解决方案如下,源于这样一个事实:最后一步可能是从n-1开始的单步跳跃,从n-2开始的两步跳跃,或者从n-3开始的三步跳跃 public static int countWaysDP(int n, int[] map) { if (n < 0) return 0; else if (n == 0)

我试图理解一本书中关于以下问题的解决方案:

一个孩子跑上n级楼梯,一次可以跳1级、2级或3级。实现一个方法来计算孩子可以跑上楼梯的可能方式

本书的解决方案如下,源于这样一个事实:最后一步可能是从n-1开始的单步跳跃,从n-2开始的两步跳跃,或者从n-3开始的三步跳跃

public static int countWaysDP(int n, int[] map) {
    if (n < 0) 
        return 0;
    else if (n == 0)
        return 1;
    else if (map[n] > -1)
        return map[n];
    else {
        map[n] = countWaysDP(n - 1, map) + countWaysDP(n - 2, map) + countWaysDP(n - 3, map);
        return map[n]; }
}
而不是:

class Staircase {
    int n;
public:
    int countWaysDP(int n, int[] map); }
为什么??类实例化多个楼梯有什么问题

谢谢

注:本书正在破解编码面试

答案2: 静态方法意味着函数不需要来自对象的任何信息

该函数只接受参数中的输入,对其进行处理并返回一些内容。 如果在函数中看不到这一点,可以将其设置为静态

非静态方法通常读取此变量的某些属性和/或在某些属性中存储值

答复1: 我将其转换为javascript,只是为了显示发生了什么

我想这就是重点。递归的工作原理通常与预期相反。它通常以相反的顺序返回值。 对于5个楼梯: 首先返回n=1;那么n=2。。。最多n=5; n=5必须等到n=4准备就绪,n=4必须等到n=3准备就绪


下面是你的n=0和n来回答你的第一个问题,为什么它返回1而不是0,假设你看到的楼梯总共有两个台阶,递归调用变成:

countWaysDP(2 - 1, map) + countWaysDP(2 - 2, map) + countWaysDP(2 - 3, map);
第二个递归调用是n变为零的调用,也就是说我们找到了一条成功的路径,因为从两个步骤中,显然有一条路径需要两个步骤。现在,如果你按照你的建议写:

n == 1: return 1 

你不会接受从两级楼梯走两级!该语句的意思是,仅当路径以单个步骤结束时,才计算路径

要回答你的第一个问题,那就是数学之美:如果楼梯只有一个台阶,那么只有一种方法可以解决它。如果有0个步骤,还有一种解决方法,那就是什么都不做

这就像,对于一个n步楼梯,m次,你可以走1步、2步或3步来完成它。如果n是1,那么m是1,有一条路。如果n为0,m为0,还有一种方法——根本不采取任何步骤

如果你写出两级楼梯的所有方式,它是[[1,1],[2]],一级楼梯是[[1]],0级楼梯是[[]],而不是[]。数组[[]内的元素数为1,而不是0


如果问题是你可以走1步或2步,这将成为斐波那契级数。请注意,fib0=1和fib1=1,它对应于同一件事:当楼梯是一个台阶时,有一种方法可以解决它。当有0个步骤时,有一种解决方法,就是什么都不做。事实证明,走两级楼梯的方法数是fib2是2,它等于fib1+fib0=1+1=2,如果fib0等于0,它就不起作用了。

你需要考虑它有一个树,每个节点上有3个可能的选项。 如果楼梯的尺寸是4 我们会有这样的东西:

(4)--1-->(3)--..(Choose a step and keep branching)...
  |__2-->(2)--..(Until you get size of zero)............
  |__3-->(1)--1-->(0) # <--Like this <--
choices = (1, 2, 3)
counter = 0

def test(size):
    global counter

    if size == 0:
        counter += 1

    for choice in choices:
        if size - choice >= 0:
            test(size - choice)

    return counter

书中有关于参数的文档吗?确切地说,n是什么,map是什么?n是楼梯中楼梯的数量。我认为map是一种存储以前调用countWaysDP的返回值的方法,当该方法使用不同的参数n值时。您应该尝试一次只问一个问题。这个问题与使用给定硬币面额计算进行更改的方法的数量有何区别?为了便于参考,请查看代码和DP解决方案,如果我使用硬币面额的方式来解决楼梯问题,我得到输入n=5的答案5,允许的步骤=1,2,3。但如果我使用上面的递归方法,我会得到答案13。请解释一下。复印件。欢迎大家来看看为什么n0=1。我仍然不理解fn=fn-1+fn-2+fn-3背后的逻辑。有人能简单地给我解释一下吗?谢谢
countWaysDP(2 - 1, map) + countWaysDP(2 - 2, map) + countWaysDP(2 - 3, map);
n == 1: return 1 
(4)--1-->(3)--..(Choose a step and keep branching)...
  |__2-->(2)--..(Until you get size of zero)............
  |__3-->(1)--1-->(0) # <--Like this <--
choices = (1, 2, 3)
counter = 0

def test(size):
    global counter

    if size == 0:
        counter += 1

    for choice in choices:
        if size - choice >= 0:
            test(size - choice)

    return counter