【问题标题】:C - Remove Duplicate Results in Recursive FunctionC - 删除递归函数中的重复结果
【发布时间】:2016-02-12 02:03:06
【问题描述】:

我必须创建一个递归函数,它可以告诉你多少美分可以变成零钱。 (使用 25 美分硬币、5 美分硬币和硬币)。

到目前为止,我有一个递归函数可以做到这一点,但是它不止一次计算相同的组合,所以这个数字太大了。如何删除重复的组合?

代码:

 #include <stdio.h>
//Prototypes
int coins(int);

int main(void){
    //Declarations
    int num;

    //Get user input
    printf("Enter an amount of change in cents: ");
    scanf("%d", &num); //Change to fgets

    //Call function
    printf("There are %d ways to make change for %d cents.\n", (coins(num)), num);
}

int coins(int amt){
    //Declarations
    int ways=0;

    //Base Case
    if(amt == 0){
        return 1;
    }

    //int ways=0; More efficient after base case.

    if(amt >= 1){
        ways+=coins(amt-1);
    }
    if(amt >= 5){
        ways+=coins(amt-5);
    }
    if(amt >= 10){
        ways+=coins(amt-10);
    }
    if(amt >= 25){
        ways+=coins(amt-25);
    }

    return ways;
}

例子:

输入:17(美分)

输出:80 种方式 **输出应为 6

【问题讨论】:

  • 什么是重复项?在我看来,制作 17(美分)的方法不止 6 种
  • @PeCosta 重复例如:1 便士 1 镍与 1 镍 1 便士。或者在我的情况下,我相信该函数不止一次地计算相同的组合。并且应该只有 6 种方法可以制作 17。
  • 哦,你没有 2 美分好吗!

标签: c recursion


【解决方案1】:
#include <stdio.h>

int coins(int, int);

int main(void){
    int num;

    printf("Enter an amount of change in cents: ");
    scanf("%d", &num);

    printf("There are %d ways to make change for %d cents.\n", coins(num, 0), num);
    return 0;
}

int coins(int amt, int kind){
    static int kinds[4] = {25, 10, 5, 1};
    int ways=0, i, n;

    if(kinds[kind] == 1)//always divisible
        return 1;

    n = amt / kinds[kind];
    for(i = 0; i <= n; ++i)
        ways+=coins(amt-kinds[kind]*i, kind + 1);

    return ways;
}

【讨论】:

  • for 循环到底是做什么的?我明白了,我只是难以用语言表达?
  • 循环计算每种情况下可以使用的硬币数量。
  • 所以,它从最大面额开始,检查当时可以使用的硬币数量,直到达到 kind[3]。对吗?
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2016-01-22
  • 2011-12-02
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多