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