C 蛮力递归函数

标签 c recursion brute-force

所以我在使用递归函数时遇到麻烦,我的问题是我有一个代表金币的数组,它是一个[]这个数组有需要与两个用户共享的硬币,方式是每个用户长期使用run 获得相同数量的黄金或最佳解决方案......就像这样

Gold
10 6 5 2
User A : gets 10 2
User B : gets 6 5

用户 A 和用户 B 之间的绝对值给了我差异。 在这种情况下,它将是 1

为了解决这个问题,我需要遍历所有可能的组合,这就是为什么我使用暴力破解和递归函数......为此,我必须运行每个组合,并查看两者之间的绝对差异(如果它比它更好)以前的我将其保存在全局变量 best 中...

问题是该功能根本无法正常工作..如果您帮助我,我将不胜感激......

代码如下:

#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;
}

最佳答案

你需要考虑一下你在做什么。例如:

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];

因此,您将第一堆交给 friend A,将第二堆交给 friend B。但是稍后您将使用 i 递增 1 进行递归,因此您将给出尽管您已经将第二堆给了 A,但它还是给了 B。这毫无意义。

你想要做的是尝试将第一堆给A,然后递归给出其余的堆,然后重新开始,尝试将第一堆给B并递归给出其余的堆并比较它们两种情况看看哪个最好。

编辑

好的,让我们一步一步来。你有你的递归函数:

int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){

这里 nelems 是堆的总数,a 是每个堆的大小,i 是已经分配了多少堆,friend_afriend_b 是给每个 friend 的金额。那么首先,如果我们已经分发了所有的桩怎么办?这是一个多好的解决方案?调用者需要知道这一点,因此我们将返回它。

    if (i == nelems) {
        return abs(friend_a - friend_b);

当我们完成时,它告诉我们做得有多好(或多差)。如果我们还没完成怎么办?好吧,那么我们需要尝试将一堆 i 分别赋予 a 和 b,看看哪个更好。

    } 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);

那么这两个哪个更好呢?好吧,我们只是比较并返回较低的那个:

        if (toA <= toB)
            return toA;
        else
            return toB;
    }
}

..这告诉我们最佳分割有多好。

关于C 蛮力递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035511/

相关文章:

C语言——将矩阵表示为指针数组

python - 为什么在python中后向递归比前向递归执行得更快

recursion - 在获取递归数据结构的所有权时避免部分移动值?

algorithm - 从原始图像中加入拼图

c - 段错误,第一次使用二维数组

c - Visual Studio 2017 Linux 项目中无法识别 Linux 头文件

C 指针和 var 作用域

javascript - 执行返回 promise 的处理程序队列

java - 蛮力数独算法

python - 将 4 色定理应用于图形数组中存储的相邻多边形列表