2016-07-18 36 views
1

我试着从下面的伪代码尚未enter image description here实现其在C伪代码的算法++

实现变化问题的递归算法我不知道如何正确地执行它,我的目标是学习如何阅读伪代码不止如何解决变更问题。

这里是我在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; 
} 
+2

为什么大家都突然变得激动起来投币变化问题? – P0W

+0

[递归硬币找零C++](http://stackoverflow.com/questions/37106465/recursive-coin-change-c) –

+0

我可是从生物信息学算法的交互式学习方法教材P204,并试图了解他们的伪阅读的可能的复制..所以我可以继续前进! – Zingo

回答

3

的伪代码:

MinNumCoins ← ∞ 

此规定 “初始化MinNumCoins到无穷大”。

您的等效代码:

int minNumCoins; 

这声明minNumCoins,但离开这个初始化。这不仅不是伪代码的状态,而且由于代码随后使用未初始化的变量,这导致了未定义的行为。

有实现这个伪两种基本方法:

1)使用第二个变量,指示值是否已设置,还是不行。将变量初始化为无穷大的目的是为了找到为其计算的最小值。在每次尝试时,MinNumCoins的潜在候选值得到计算,并且如果它小于当前值MinNumCoins,则新值替换它。 MinNumCoins最终得到的值是计算得出的最小值。

通过初始化具有正无穷大的变量,可以得到MinNumCoins的第一个计算值并将其设置(因为第一个计算值总是小于无穷大)。

替换逻辑使用第二个变量flag来指示是否设置了该值。如果不是这样,不管它是什么,值都会被设置。但如果已设置该变量,则代码将像往常一样将其与新计算的值进行比较,如果计算值小于现有值,则更新它。

2)第二种方法是将变量初始化为尽可能高的值。 “无穷大”没有任何价值,int可以设置为。最接近的标准是可以设置的最大最大值int。这将是:

#include <limits> 

int MinNumCoins = std::numeric_limits<int>::max(); 

这是否有点“黑客”将是你的问题的可接受的解决方案,是什么让你决定。

+0

谢谢@sam你救了我的一天:))) – Zingo

0

那么,一个问题,我可以在这里看到的是,你声明minNumber硬币,但你还没有初始化它专门为任意数字。因此,它在开始时的值为0(零),当与正数比较时,它不会返回真,因为它不会大于正数。这就是为什么你的程序无法正常工作。我在执行伪代码时看不到任何其他问题。你已经完成了。好运:)

+0

不,它的值不会为0.它是未初始化的,这会导致未定义的行为。在代码示例中,MinNumCoins不是0初始化的。 –

+0

@SamVarshavchik你是对的。这取决于编译器。一些初始值为0,有些不会。 – Athena

+0

我知道没有编译器会默认初始化一个未初始化的对象。由于编译器尽力生产出最快,最小的代码,这将是相当不可能的编译器突然渴望产生了一堆的,他们并不一定要生成代码。 –

1

而且,“从全部退后(!)...(ahem)...“

...并可能从而揭示我年龄...(k脱离)...

...好心记得” 代码”是只(!!)曾经意图是: “(非常不精确的...)是指两个人类不妨来表达的算法彼此。”

当两个人类选择描述特定算法“伪代码”,它是隐含他们之间了解,他们已选择在一个特定的编程方面(语言或风格),他们两人互相结识交流“。不过,这应该不是扩展到意味着有任何形式的直接1:“实际的计算机源代码” 1“他们在说什么”之间的对应