【问题标题】:Passing pointer from recursive function从递归函数传递指针
【发布时间】:2017-10-13 03:29:20
【问题描述】:

我被要求仅使用递归方法进行选择排序代码。所以我考虑制作另一个函数来查找存储最大值的数组,然后将其切换到我的另一个函数中。

void p_rec_max(int data[], int cur, int arrSize,int * x) {
    if(cur < arrSize - 1) {
        if(data[cur] > data[arrSize - 1]) {
            *x = cur;
        } else if(data[cur] < data[arrSize - 1]){
            *x = arrSize - 1;
        }
        p_rec_max(data,cur + 1,arrSize,&x);
    }
}

void rec_selection_sort(int data[], int arrSize) {
    if(arrSize > 0) {
        int maxi,temp;
        p_rec_max(data,0,arrSize,&maxi);
        temp = data[arrSize - 1];
        data[arrSize - 1] = data[maxi];
        data[maxi] = temp;
        rec_selection_sort(data,arrSize - 1);
    }
}

收到这样的警告

在函数“p_rec_max”中: 警告:从不兼容的指针类型传递“p_rec_max”的参数 4 [默认启用] 注意:预期为“int *”,但参数类型为“int **”

而且它根本不会改变我的数组。 我缺乏在函数中传递指针的信息不能帮助我解决这个问题。 你们能修复我的代码,然后向我解释我的代码有什么问题吗? 谢谢

【问题讨论】:

标签: c function pointers recursion


【解决方案1】:

第一个问题

这行有问题:

p_rec_max(data,cur + 1,arrSize,&x);
                               ^^

由于xint *&amp;xint **,这不是函数所期望的。

将行改为:

p_rec_max(data,cur + 1,arrSize, x);

x前面没有&amp;

第二个问题

您的p_rec_max 函数没有找到最大数组值的索引。

如果所有数组元素都相同,则代码将永远不会执行*x = ...。换句话说,maxi 永远不会被写入,您最终会在此处使用未初始化的索引 data[arrSize - 1] = data[maxi]; 这是未定义的行为,可能会使您的程序崩溃。

除此之外,我认为函数中的基本逻辑是错误的。代码总是将cur 与最后一个数组元素进行比较。这似乎是错误的。我认为您应该将cur 与迄今为止找到的最大值进行比较。这可以使用变量x 来完成。

类似:

void p_rec_max(int data[], int cur, int arrSize,int * x) {
    if(cur < arrSize) {
        if(data[cur] > data[*x]) {
            *x = cur;
        }
        p_rec_max(data, cur + 1, arrSize, x);
    }
}

rec_selection_sort 中这样称呼它:

    maxi = 0;  // Assume index zero holds the maximum
    p_rec_max(data, 1, arrSize, &maxi);
                    ^
                 Start searching from index 1

顺便说一句:使用递归函数来查找数组中的最大值当然不是一个好方法,但我猜你不允许使用简单的forwhile循环.

【讨论】:

  • 完成了,删除了错误信息。但是数组根本没有排序。
  • 非常感谢。真的很有帮助
猜你喜欢
  • 2012-02-22
  • 2010-10-02
  • 1970-01-01
  • 2015-06-16
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2018-07-10
相关资源
最近更新 更多