所以我在使用递归函数时遇到了麻烦,我的问题是我有一个表示金币的数组,这是一个[]这个数组有硬币,需要与两个用户共享,方式是每个用户在长运行得到相同数量的黄金或最佳解决方案......像这样
Gold
10 6 5 2
User A : gets 10 2
User B : gets 6 5
用户A和用户B之间的绝对值给出了不同之处。 在这种情况下,它将是1
要解决这个问题,我需要通过所有可能的组合,这就是为什么我使用强力和递归函数...为了做到这一点,我必须运行每一个组合,看看两者之间的绝对差异,如果它比它更好以前的我把它保存在全局变量中最好...
问题是功能根本不起作用..如果你帮助我,我将不胜感激......
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int best = 0; // keeps the best option
int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
int sub = 0;
friend_a += a[i];
friend_b += a[i+1];
if(i+1 == nelems){
return 0;
}else{
sub = abs(friend_a - friend_b);
if(sub < best){
best = sub;
}
i++;
share_friends_recursive(nelems,a,friend_a,friend_b,i);
}
}
int main(int argc, char *argv[]) {
//
int nelems = 4;
int a[] = {10,6,5,2};
//friend A can get the first value
// friend B gets the second one ...
share_friends_recursive(nelems,a,0,1,0);
printf("%d \n",best);
return 0;
}
答案 0 :(得分:2)
你需要考虑你在做什么。例如:
int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
int sub = 0;
friend_a += a[i];
friend_b += a[i+1];
所以你要给第一堆扑灭A而第二堆给朋友B.但是你以后会以i
增加1来递减,所以你要给第二堆即使你已经把它给了B.这没有任何意义。
你要做的是尝试将第一堆给A然后递归给出剩下的桩,然后重新开始,尝试将第一堆给B并递归给出剩下的桩并比较那些两个案例看哪个最好。
修改强>
好的,让我们一步一步来看看。你有递归功能:
int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
此处nelems
是桩的总数,a
是每个桩的大小,i
是已经分配了多少桩,friend_a
和{ {1}}给每个朋友多少钱。首先,如果我们分配了所有的桩怎么办?这个解决方案有多好?调用者需要知道,所以我们将返回它。
friend_b
告诉我们,当我们完成时,我们做得有多好(或多么糟糕)。如果我们没有完成怎么办?那么,我们需要尝试将堆 if (i == nelems) {
return abs(friend_a - friend_b);
给予a和b,看看哪个更好。
i
那么哪个更好?好吧,我们只是比较并返回较低的一个:
} else {
int toA = share_friends_recursive(nelems, a, friend_a + a[i], friend_b, i+1);
int toB = share_friends_recursive(nelems, a, friend_a, friend_b + a[i], i+1);
..这告诉我们最好的分裂是多么好。
答案 1 :(得分:0)
新代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int best = 10; // keeps the best option
int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
if(i == nelems){
return abs(friend_a - friend_b);
}else{
int n = abs(friend_a - friend_b);
int toA = share_friends_recursive(nelems, a, friend_a + a[i],friend_b,i+1);
int toB = share_friends_recursive(nelems, a, friend_a, friend_b + a[i],i+1);
printf("[%d]: value A: %d, Value B: %d \n",i,toA,toB);
if (toA <= toB)
return toA;
else
return toB;
}
}
int main(int argc, char *argv[]) {
//
int nelems = 4;
int a[] = {10,6,5,2};
//friend A can get the first value
// friend B gets the second one ...
best = share_friends_recursive(nelems,a,0,1,0);
printf("%d \n",best);
return 0;
}
在这种情况下,不是给1
而是给0
这是错误的,就像我在上面的例子中所示......我似乎无法找到这个案例的问题......如果有人可以帮助我,我会是apreciated ...
提供此程序的当前错误输出是:
[3]: value A: 22, Value B: 18
[3]: value A: 12, Value B: 8
[2]: value A: 18, Value B: 8
[3]: value A: 10, Value B: 6
[3]: value A: 0, Value B: 4
[2]: value A: 6, Value B: 0
[1]: value A: 8, Value B: 0
[3]: value A: 2, Value B: 2
[3]: value A: 8, Value B: 12
[2]: value A: 2, Value B: 8
[3]: value A: 10, Value B: 14
[3]: value A: 20, Value B: 24
[2]: value A: 10, Value B: 20
[1]: value A: 2, Value B: 10
[0]: value A: 0, Value B: 2
0