【发布时间】: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 美分好吗!