Im trying to implement a recursive algorithm of Change problem from the following pseudocode
但我不知道如何正确实现它,我的目标是学习如何阅读伪代码,而不是如何解决更改问题。
这里是我在 c ++ 中的代码
int recChange(int money){
int coins [6] = { 50, 25, 20, 10, 5, 1 };
if (money == 0) return 0;
int minNumberCoins;
for (int i=0; i < 6; ++i){
if (money >= coins[i]) {
int numberCoins = recChange(money - coins[i]);
if (numberCoins + 1 < minNumberCoins ){
minNumberCoins = numberCoins + 1;
}
}
}
return minNumberCoins;
}
伪代码:
MinNumCoins ← ∞
这说明“将 MinNumCoins 初始化为无穷大”。
您的等效代码:
int minNumCoins;
这声明了minNumCoins
,但未初始化。这不仅不是伪代码的状态,而且由于代码随后使用未初始化的变量,这导致未定义的行为。
有两种基本的方法来实现这个伪代码:
1)使用第二个变量,该变量指示是否已设置该值。将变量初始化为无穷大的目的是找到为其计算的最小值。每次尝试时,都会计算出MinNumCoins
的潜在候选值,如果该值小于MinNumCoins
的当前值,则新值将替换该值。MinNumCoins
最终计算出最小值。
通过用正无穷大初始化变量,这具有取MinNumCoins
的第一个计算值并设置它的效果(因为第一个计算值将始终小于无穷大)。
替换逻辑使用第二个变量(一个标志)来指示值是否已被设置。如果不是,则无论值是什么,该值都会被设置;但是如果变量已被设置,则代像往常一样将其与新的计算值进行比较,并在计算值小于现有值时对其进行更新。
2)第二种方法是将变量初始化为最高可能值。没有“无穷大”的值,可以将int
设置为。最接近的候选项将是int
可能设置的最高最大值。这将是:
#include <limits>
int MinNumCoins = std::numeric_limits<int>::max();
这个有点“黑客”是否会是你的问题的可接受的解决方案,是你决定的事情。
而且,“从所有(!)退后...(ahem)...”
...可能从而揭示了我的年龄...(koff)...
...请记住,“伪代码”是唯一的(!!)曾经打算:“a(非常精确...)表示两个人类可能希望彼此表达算法。”
当两个人选择“用伪代码”描述特定的算法时,他们之间隐含地理解为他们选择了根据特定的编程(语言或样式)进行通信。他们都很熟悉。”但是,这应该不扩展为表示在“他们在说什么”和“计算机”之间存在任何直接的 1:1 对应关系。
好吧,我在这里可以看到的一个问题是,您已经声明了 minNumber 硬币,但是您还没有将其专门初始化为任何数字。结果,它在开始时将具有 0(零)的值,并且当将其与正数进行比较时,它将永远不会返回 true,因为它不大于正数。这就是为什么您的程序无常工作的原因。在实现伪代码时,我没有看到任何其他问题。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(63条)