从递归函数传递指针

时间:2017-05-14 06:22:29

标签: c function pointers recursion

我一直要求用递归方法制作选择排序代码。所以我想创建另一个函数来查找存储最大值的数组,然后将其切换到我的其他函数中。

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 **'

它根本不会改变我的阵列。 我缺乏在函数中传递指针的信息无法帮助我解决这个问题。 你们可以修复我的代码然后向我解释我的代码有什么问题吗? 感谢

1 个答案:

答案 0 :(得分:2)

第一个问题

这行有问题:

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

由于xint *&xint **,它不是函数所期望的。

将行更改为:

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

即。 &

前面没有x

第二个问题

您的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

BTW:使用递归函数查找数组中的最大值原因不是一个好办法,但我想你不能使用简单的for或{{ 1}}循环。

相关问题