但我不知道如何正确实现它,我的目标是学习如何阅读伪代码而不是如何解决变更问题。
这是我在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;
}
答案 0 :(得分:3)
伪代码:
MinNumCoins ← ∞
这表示&#34;将MinNumCoins初始化为无穷大&#34;。
您的等效代码:
int minNumCoins;
这声明minNumCoins
,但保留未初始化。这不仅不是伪代码所说的,而且由于代码随后使用了未初始化的变量,因此会导致未定义的行为。
实现此伪代码有两种基本方法:
1)使用第二个变量,指示是否已设置该值。将变量初始化为无穷大的目的是找到为其计算的最小值。在每次尝试时,计算MinNumCoins
的潜在候选值,如果它小于MinNumCoins
的当前值,则新值将替换它。 MinNumCoins
最终具有为其计算的最小值。
通过使用正无穷大初始化变量,可以获取MinNumCoins
的第一个计算值并设置它(因为第一个计算值总是小于无穷大)。
替换逻辑使用第二个变量(标志)来指示是否已设置该值。如果不是,则无论它是什么,都会设置该值;但如果已设置变量,则代码会像往常一样将其与新计算值进行比较,如果计算值小于现有值,则更新它。
2)第二种方法是将变量初始化为最高可能值。 &#34;无穷大&#34;没有价值,int
可以设置为。最接近的候选者将是int
可能设置的最高最大值。这将是:
#include <limits>
int MinNumCoins = std::numeric_limits<int>::max();
这是否有点&#34; hack&#34;对你的问题来说是一个可接受的解决方案,你可以自行决定。
答案 1 :(得分:1)
而且,“退出所有(!)这个......(咳咳)......”
......并可能因此揭示我的年龄 ......(koff)......
...请记住,“伪 - 代码”只是(!!)曾经打算成为:“a(非常精确......)意味着两个人类可能希望彼此表达一种算法。“
当两个人类选择描述“伪代码”中的特定算法时,他们之间隐含地理解他们已选择根据特定编程(语言或语言)进行通信这两个人都是相互认识的。“但是,这应该不延伸到意味着”他们之间有任何直接1:1的对应关系正在说“和”实际的计算机源代码。“
答案 2 :(得分:0)
嗯,我在这里看到的一个问题是你已经宣布了minNumber硬币,但你还没有专门将它初始化为任何数字。因此,它在开始时将具有值0(零),并且在将其与正数进行比较时,它将永远不会返回true,因为它不大于正数。这就是为什么你的程序无法正常工作的原因。我没有看到实现伪代码的任何其他问题。你已经完成了它。祝你好运:)