【问题标题】:Pass array by value to recursive function possible?可以按值将数组传递给递归函数吗?
【发布时间】:2013-04-18 22:16:04
【问题描述】:

我想编写一个递归函数来构建问题的所有可能解决方案。我在想我应该传递一个数组,然后在每个递归步骤中,将它设置为该递归步骤中可能的所有值,但后来我开始想知道这是否可能,因为 C 通过传递一个指针来传递一个数组。您通常如何处理这个问题?

我正在考虑这些方面的事情。根据选择的路径,该数组将采用许多不同的值。我猜我们真正想要的是按值传递数组。

recFunc(int* array, int recursiveStep) {
    for (int i = 0; i < a; i++) {
        if (stopCondition) {
            doSomething;    
        }
        else if (condition) {
            array[recursiveStep] = i;
            recFunc(array, recursiveStep+1);        
        }
    }
}

【问题讨论】:

  • 在您提供的实现中,您不需要复制数组,每一级递归都会修改自己的元素。

标签: c arrays recursion


【解决方案1】:

您可以通过将数组粘贴到结构中来按值传递数组:

struct foo { int a[10]; };

void recurse(struct foo f)
{
    f.a[1] *= 2;
    recurse(f);    /* makes a copy */
}

【讨论】:

  • 感谢您的回答!假设递归调用的数量很多,是首选其他方式还是要这样做?
  • @sporetrans 首选的方法是不要一遍又一遍地复制数组。
  • @H2CO3 你将如何在不复制数组的情况下递归地解决它?这并不是函数必须是递归的。所以这样做(在结构中包装数组)在某种意义上不是“好的”编程实践?谢谢
【解决方案2】:

如果你需要按值传递,你总是可以将你的数组包装成一个结构并传递它。请记住,您现在包含的结构数组仍然需要足够大以处理所有情况。

【讨论】:

  • :-) 对。你从我这里得到 +1 的原因是第一个(而且因为它是正确的)。
【解决方案3】:

将其包装在结构中。

typedef struct arr_wrp {
    int arr[128]; // whatever
} arr_wrp;

void recFunc(arr_wrp arr, int step) {
    // do stuff, then
    arr.arr[step] = i;
    recFunc(arr, step + 1);
}

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2014-02-07
    • 2018-04-04
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多