Recursive coin change c++

ⅰ亾dé卋堺 提交于 2019-12-13 01:44:57

问题


My program seems to be crashing every time it recursive calling in the minimum function. Can anyone tell me why it is crashing. It would instantly freeze after i call the minimum function. Is it because im using a vector?

#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>

using namespace std;

int minimum(vector<int> denom, int s, int N) //take in denomination , sizeofcoin, and value of N
{
    if(N == 0)
    {
        return 1;
    }
    else if(N < 0 || (N > 0 && s <=0))
    {
        return 0;
    }
    else
    {
        return min(minimum(denom,s - 1, N), 1 + minimum(denom, s,N-denom[s-1]));
    }
}
int main()
{
    int N;
    unsigned int sizeofcoin;
    cout << "Enter the value N to produce: " << endl;
    cin >> N;
    cout << "Enter the number of different denominations: " << endl;
    cin >> sizeofcoin;

    vector<int> denom(sizeofcoin);
    for(unsigned int i= 0; i < sizeofcoin; i++)
    {
        cout << "Enter denomination #" << (i+1) << endl;          //save all the denominations in an array
        cin >> denom[i];
    }

    sort(denom.begin() , denom.end(),greater<int>());    //sort the array from largest to smallest
    if(denom.back() != 1)                                 //check the end of the array (since the back is smallest now) if it has 1
    {
        denom.push_back(1);                             //Will include 1 if the user does not input a 1 (doesn't have to be used)
    }
    minimum(denom,sizeofcoin,N);
    return 0;
}

回答1:


I tried to explain your minimum() function to your rubber duck, and your rubber duck has a question for you. Here's how our conversation went:

int minimum(vector<int> denom, int s, int N) //take in denomination , sizeofcoin, and value of N
{
    if(N <= 0)
    {
        return 0;
    }

Me: this minimum() recursive function immediately returns if its third parameter, N, is 0, or negative.

Your Rubber Duck: Ok.

    return (minimum(denom,s - 1, N)...

(Here, I tried explaining your first recursion call here, to your rubber duck):

Me: So, this makes a recursive call, with the same parameters, except that the 2nd parameter is decremented. The third parameter is N.

Your Rubber Duck: So, if the third parameter's value, N, is unchanged, and the recursive function returns without recursing only when N is 0 or negative, and the initial call to minimum() passes a value greater than 0 for N, then when exactly do you expect this recursion to stop?

I couldn't answer this question myself, maybe you can explain this to your rubber duck, by yourself. When does recursion stop, here?




回答2:


You have the recursive call minimum(denom,s - 1, N) so N will never be less than or equal to 0, and the recursion will never end.

This would have been very easy to find out if you learned how to use a debugger, and stepped through the code line by line, and stepped into the recursive calls.




回答3:


Another thing that I want to point out is that you are trying to return the sum of two values:

(minimum(denom,s - 1, N) + minimum(denom, s,N-denom[s-1])

instead what you should do is:

min(minimum(denom,s - 1, N), 1 + minimum(denom, s,N-denom[s-1]))

The idea is that in first call you've not used any coin but in second call you have used one, so adding 1 for the same.

Look for a Dynamic Programming solution for the same. https://people.cs.clemson.edu/~bcdean/dp_practice/



来源:https://stackoverflow.com/questions/37106465/recursive-coin-change-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!