如何使我的递归C程序更有效?

时间:2013-11-29 21:10:35

标签: c arrays optimization recursion malloc

我必须在c中编写一个程序,找出验证这种情况的对的数量:

i<j && a[i]>a[j]

a []是包含N个元素的数组

示例:给定 N = 4 a = {1,7,2,0} 对的数量 4 :< strong>(1,0),(7,2),(7,0),(2,0)

我编写的这段代码有效,但效率很低:

#include <stdio.h>
#include <stdlib.h>
#define N 4

int count(int a[],int i, int j);

int main(){

   int i,c=0;

   int a[]={1,7,2,0};

   for(i=0; i<N-1;i++)
      c+=count(a,i,N-1);

   printf("%d",c);

   return 0;
}

int count(int a[N], int i, int j){
    if(j<0)
       return 0;

     if(i<j && a[i]>a[j])
        return 1+count(a,i,j-1);

     return 0+count(a,i,j-1);
}

另外,如何使用malloc实现数组的动态生成?我应该在count函数的main函数中创建数组吗?

3 个答案:

答案 0 :(得分:3)

基本上,您希望计算数组中的反转。这可以使用具有合并排序算法的tehnique simillar来实现。我建议你看一下下面的文章:http://www.cs.umd.edu/class/fall2013/cmsc451/Lects/lect09.pdf

谈到动态数组生成,您可能想要知道,自C99起,有variable length arrays(它们的大小不再需要是常量)。

如果你真的想要或者需要使用malloc,你应该先看一下指针。在你知道如何处理指针之后,一切都会很清楚,因为malloc只是设置了一个游乐场,你可以用指针来玩。

答案 1 :(得分:1)

我不确定你为什么要使用递归或它如何使它更快。我建议使用双循环,因为它更容易阅读:

for(i = 0 ; i < N-1 ; i++)
    for(j = i+1 ; j < N ; j++)
        c += (a[i]>a[j]) ? 1 : 0;

答案 2 :(得分:0)

一般来说,递归解决方案在递归后会有连续性(加法)。通过使用累加器作为一个参数来创建返回值,可以使它更好一些,对于某些编译器,递归将被优化为循环:

int count(int a[N], int i, int j)
{
    return count_aux(a, i, j, 0);
}

int count_aux(int a[N], int i, int j, int acc)
{
    if ( j<0 )
       return acc;
    else
       return count_aux(a,i,j-1, ( i<j && a[i] > a[j] ? acc+1 : acc ));
}