【问题标题】:Monkey can take either 2 or 3 steps - how many different ways to reach the top?Monkey 可以走 2 步或 3 步——有多少种不同的方法可以到达顶峰?
【发布时间】:2018-09-09 22:13:56
【问题描述】:

所以基本上我正在尝试以递归方式和动态方式解决这个问题。 问题听起来是这样的:有“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 步的类似问题之后,我也不知道如何动态地执行此操作。这里有什么不同?如果有人解决了类似问题,将不胜感激。

【问题讨论】:

  • 如果n &lt; 0 呢?
  • 已经是一个“动态”解决方案(正确的短语是动态编程) - 它根据子解决方案计算问题的解决方案- 问题(虽然还不正确)。
  • @HenkHolterman 已编辑,感谢您的关注 - 如果编辑正确的话。
  • @meowgoesthedog 我所说的动态方法类似于:geeksforgeeks.org/dynamic-programming-set-7-coin-change 在“动态编程解决方案”中,还是我理解不正确? - 所以我写的不是递归方法?
  • 一个算法既可以是DP也可以是递归的;事实上,递归通常是实现 DP 方法最自然的方式。

标签: c# algorithm dynamic-programming


【解决方案1】:

略有不同的版本。没有理由将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;            
}

【讨论】:

  • 感谢您提供更好的实现 - 您知道使用动态方法的效果吗?
  • 和其他人评论的一样,我在这里看不到非动态的。
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多