猴子可以采取2步或3步 - 到达顶部的方式有多少?

时间:2018-03-30 21:34:58

标签: c# algorithm dynamic-programming

所以基本上我试图以递归和动态方式解决这个问题。 问题听起来像这样:有“n”步的台阶如果她只能跳过1步或2步(她不能跳到下一步),那么猴子可以通过多少种方式到达顶部。

让我们说我们有4个台阶的楼梯 - 只有一种方式2-2 = 1路(如果她尝试跳过3 - 她不能踩到下一个到达顶部)。

5个步骤可能是:2-3和3-2 = 2种方式。 (我们可以说“超过1步跳跃”= 2步。“超过2步跳跃”= 3步)

所以这听起来与通常类似“可以采取1步或2步,有多少种方式?”问题,但因为有“2或3步” - 不知何故,它让我感到困惑。

我的解决方案递归地看起来像这样:

        static int F1(int n, int ways)
    {
        if (n < 0) return 0;
        if (n > 0) return F1(n - 2, ways) + F1(n - 3, ways);
        else
        {
            if (n == 0) ways++;
            return ways;
        }
    }

但即使看了1和2步的类似问题,我也不知道如何动态地做到这一点。这有什么不同?会感激某种帮助,或者如果某人有这样的东西解决了。

1 个答案:

答案 0 :(得分:2)

略有不同的版本。没有理由将ways作为输入传递,steps用于诊断:

static int F1(int n, string steps)
{                        
    if (n == 0)
    {
        Console.WriteLine(steps);
        return 1;
    }
    else if (n > 0)
    {
        return F1(n - 3, steps + "3") + F1(n - 2, steps + "2");
    }

    // else: no dice, invalid outcome
    return 0;            
}