Я внес изменения, как упомянуто shsmith, и вот модифицированная и полная программа на С ++.
#include <iostream>
using namespace std;
int i = 0;
void makechange(int amt, int *onhand, int *denoms, int ndenoms, int *thechange)
{
if ( (denoms[i] * onhand[i]) > amt)
{
onhand[i]--; // # of coins is too much, decrement and try again
makechange(amt, onhand, denoms, ndenoms, thechange); // try agan
}
thechange[i] = onhand[i]; //found #of coins
amt = amt - denoms[i]*onhand[i]; // get remaining amount from change
i++;
if (amt != 0) // we're not done with change so move on to next denomination
{
makechange(amt, onhand, denoms, ndenoms, thechange);
}
else if (amt == 0) // we're done with the change so all the other # coins = 0
{
for (int j = i; j < ndenoms; j++)
{
thechange[j] = 0;
}
}}
int main(){
//Now, down in main when I actually call the function prototype and print out the result
int amt = 80, onhand[] = {3, 0, 1, 0}, denoms[] = {25, 10, 5, 1}, ndenoms = 4, thechange[4];
makechange(amt, onhand, denoms, ndenoms, thechange);
for (int k = 0; k < ndenoms; k++)
{
cout << thechange[k] << " ";
}
cout << "\n";
return 0;}
Этот код отлично работает на моей машине. Я скомпилировал его, используя Cygwin.
Примечание: этот алгоритм будет работать, только если у вас есть монеты достоинства больше или правильно на руках. Если у вас недостаточно монет, то для рекурсивного метода нет выхода, потому что 'amt' никогда не станет нулевым. В то же время вы никогда не проверяете значение «i», находится ли оно в пределах «ndenoms». Это также может привести к ошибкам за пределами границ, что может привести к некорректному завершению работы программы.