c - 如何实现这个函数的递归版本

标签 c recursion data-structures heapsort

我需要实现这个函数的递归版本:

static void peneira (int m, int v[]) {
    int f=2, t;
    while(f<=m){
        count_Iteracoes_HeapSort++;
        if(f<m && v[f] < v[f+1])++f;
        if(v[f/2] >= v[f]) break;
        t = v[f/2]; v[f/2] = v[f]; v[f] = t;
        f *= 2;
    }

}

我正在做这样的事情:

static void peneiraRec(int m,int v[]){
    count_Iteracoes_HeapSort++;
    int f=2,t;
    if(m<=1) {
        return;
    }
    while(f<=m) {
        peneiraRec(m - 1, v);
        if (f < m && v[f] < v[f + 1]) ++f;
        if (v[f / 2] >= v[f]) break;
        t = v[f / 2];v[f / 2] = v[f];v[f] = t;
        f *= 2;
    }
}

但这行不通。谁能帮帮我?

该函数是堆排序的辅助函数。我会发布所有代码

 static void 
constroiHeap (int m, int v[])
{
   int k; 
   for (k = 1; k < m; ++k) {                   
      // v[1..k] é um heap
      int f = k+1;
      while (f > 1 && v[f/2] < v[f]) {  // 5
         troca (v[f/2], v[f]);          // 6
         f /= 2;                        // 7
      }
   }
}

static void peneira (int m, int v[]) {
    int f=2, t;
    while(f<=m){
        count_Iteracoes_HeapSort++;
        if(f<m && v[f] < v[f+1])++f;
        if(v[f/2] >= v[f]) break;
        t = v[f/2]; v[f/2] = v[f]; v[f] = t;
        f *= 2;
    }

}

void
heapsort (int n, int v[])
{
   int m;
   constroiHeap (n, v);
   for (m = n; m >= 2; --m) {
      troca (v[1], v[m]);
      peneira (m-1, v);
   }
}
int main{
  int v0[6] = {0,63726,2323,0,32,236723};
  heapsort_rec(5, v0);
}

输出:v0 = 0,32,2323,63726,236723

基本上,我需要我的输入是一个排序数组,输出应该是有序数组。

我需要递归地实现这个peneira函数

最佳答案

任何循环都可以递归,方法是将循环体变成一个将循环变量作为参数(除了循环内使用的变量之外)的函数。该函数首先测试循环变量以查看是否已达到边界,如果已达到则返回。否则,它执行循环的一次迭代,然后用循环变量的新值调用自身。通常,您需要两个功能;递归步骤函数,以及另一个使用循环变量的初始值调用递归步骤的函数。

static void peneira_rec (int f, int m, int v[]) {
    int t;
    if(f > m) return; // exit loop

    count_Iteracoes_HeapSort++;
    if(f<m && v[f] < v[f+1])++f;
    if(v[f/2] >= v[f]) return; // exit loop
    t = v[f/2]; v[f/2] = v[f]; v[f] = t;
    peneira_rec(f*2, m, v); // loop again
}

static void peneira (int m, int v[]) {
    peneira_rec(2, m, v); // start the loop
}

关于c - 如何实现这个函数的递归版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486286/

相关文章:

c - 灵活阵列成员的真正好处是什么?

c - 为什么这些连续的宏替换不会导致错误?

MIPS 中的递归最大公约数

java - 如何在数组:中查找包含相等总和的子集

algorithm - 在附加条件下查找数组中可能的序列数

c - Lapack 在尝试反转矩阵之前是否检查矩阵是否可逆

在 C 中递归连接字符串

c# - 由于某种原因,我的递归函数跳过了调用自身

sql - 在SQL语句中查找递归和

c - 无法理解c中的空指针