【问题标题】:Passing an array to a function and subset sum program将数组传递给函数和子集求和程序
【发布时间】:2014-02-26 22:23:21
【问题描述】:

我正在尝试创建一个程序来查找其元素总和为特定目标的所有子集。我的逻辑是:假设我有一个像这样的 6 个元素的数组 {3,2,4,1,1,9}.

要找到元素总和为 5 的子集,我所要做的就是获取第一个元素,如果它的值小于 5,那么我将移动到数组的下一个元素,并寻找其元素和的子集不同之处:第一个元素的 5 值,依此类推。 当然,如果元素的值大于 5,那么我会移动到下一个元素。

我一直在尝试使用递归函数来执行此操作,我将在其中传递我的数组。

我的问题是我无法理解如何将我的数组传递给我的函数,以及我应该如何再次使用我的函数移动到下一个元素。老实说,我对这个主题进行了研究,但我真的找不到任何对我有帮助的东西。

我使用 C 并像 void subset(int x[],int n); 这样声明我的函数,其中 n 是我的数组元素的数量。我无法真正理解 x[] 部分。我的兄弟让我这样做,但我真的不明白为什么。

【问题讨论】:

    标签: c arrays function recursion


    【解决方案1】:

    所以你试图将你的数组传递给一个函数?数组具有将使用括号“[]”引用的元素或成员,例如在数组“int arry[6]={1,2,3,6,5};”中第一个元素是数字“1”,我们可以使用 arry[0]

    恕我直言,您似乎没有在该领域进行“诚实的研究”,我建议您继续,因为数组几乎是每种语言不可或缺的一部分。

    下面是一些 c 代码,可以帮助您开始作业。 int arry[] 是一种完全不同于“int arry”的类型。括号部分告诉我们它是一个数组。

    #include <stdio.h>
    int main()
    {
    int arry[6]={1,2,3,6,5};
    
    myFunction(arry,4);
    
    return 0;
    }
    
    
    int myFunction(int myarr[], int x){
    
    printf("the number %d element is %d",x+1,myarr[4]);
    return 0;
     }
    

    【讨论】:

      【解决方案2】:

      这是一个精心设计的解决方案。对于给定的数据,它会产生:

      Data (6): 3 2 4 1 1 9
      Found: 3 + 2 = 5
      Found: 3 + 1 + 1 = 5
      Found: 4 + 1 = 5
      Found: 4 + 1 = 5
      

      关键是要了解解决问题需要哪些数据。你需要知道:

      • 目标总和
      • (到目前为止的元素总和)
      • 未选中元素的数量和列表
      • 列表中已有元素的数量和列表

      “到目前为止的总和”可以从列表中已有元素的数量和列表中得出,但传递它也很方便。这给出了一个 6 参数递归函数。它使用所需的目标、0 作为到目前为止的总和、要搜索的完整元素数组以及一个足够大以容纳所有要搜索的元素的空列表来调用。这发生在main()。该函数识别它是否找到任何添加到目标的列表(如果没有则返回 0,如果找到则返回 1),因此测试和报告以及 main() 的结尾。

      在函数中,检查各种不可能的情况并退出。如果在顶部使用debug = 1 编译,则在函数入口处打印数据。扫描剩余的未检查元素,检测元素何时使总和等于目标并报告这样做的列表(注意它丢失了原始索引信息;您可以添加它,但这是读者的练习)。如果元素小到可以为另一个元素留出空间,则将该元素添加到找到的列表中,并将数组的其余部分传递给函数的递归调用。其他功能是琐碎的打印循环。

      当目标设置为 40(而不是 5)时,它会正确报告未找到任何子集,总和为 40。

      可能有更简单的编码方法,但我病态地反对不必要的全局变量(我认为debug 是一种有条件地编译代码的方法,而不是全局变量)。可以将参数列表打包在一个结构中;不过,我不确定这是否会有所帮助。如果我包含&lt;stdbool.h&gt;,我可以使用bool 而不是int(以及falsetrue 而不是01)。代码是C99或C11;它不会像在 C89 下编写的那样编译(但让它与 C89 一起工作并不难)。

      代码:

      #include <stdio.h>
      
      static const int debug = 0;
      
      static void found_one(int num, int *list)
      {
        printf("Found: ");
        char const *pad = "";
        int sum = 0;
        for (int i = 0; i < num; i++)
        {
          printf("%s%d", pad, list[i]);
          pad = " + ";
          sum += list[i];
        }
        printf(" = %d\n", sum);
      }
      
      static void print_array(char const *tag, int num, int *arr)
      {
        printf("%s (%d):", tag, num);
        for (int i = 0; i < num; i++)
          printf(" %d", arr[i]);
        putchar('\n');
      }
      
      static int find_subsets(int target, int sumsofar, int num_src, int *src,
                              int num_dst, int *dst)
      {
        if (sumsofar >= target)
          return 0;
        if (num_src <= 0)
          return 0;
        if (debug)
        {
          printf("-->> %s: sumsofar = %d, num_src = %d, num_dst = %d\n",
                 __func__, sumsofar, num_src, num_dst);
          print_array("Source", num_src, src);
          print_array("Dest'n", num_dst, dst);
        }
        int rc = 0;
        int max = target - sumsofar;
        for (int i = 0; i < num_src; i++)
        {
          if (src[i] == max)
          {
            dst[num_dst] = src[i];
            found_one(num_dst + 1, dst);
            rc = 1;
          }
          else if (src[i] < max)
          {
            dst[num_dst] = src[i];
            if (find_subsets(target, sumsofar + src[i], num_src - (i + 1),
                             src + (i + 1), num_dst + 1, dst))
              rc = 1;
          }
        }
        if (debug)
          printf("<<-- %s: %d\n", __func__, rc);
        return rc;
      }
      
      int main(void)
      {
        int data[] = { 3, 2, 4, 1, 1, 9 };
        enum { NUM_DATA = sizeof(data) / sizeof(data[0]) };
        int subset[NUM_DATA];
        int target = 5;
        print_array("Data", NUM_DATA, data);
      
        if (find_subsets(target, 0, NUM_DATA, data, 0, subset) == 0)
          printf("Did not find any subsets totalling %d\n", target);
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        • 2012-08-06
        • 2012-05-30
        • 2018-07-02
        • 1970-01-01
        相关资源
        最近更新 更多