递归函数,其返回的数字数量大于数组的第一个索引

时间:2019-04-03 02:00:42

标签: c recursion

返回大于数组第一个索引的数字的递归函数

我有一个可以解决问题的函数,但是我不确定这是否是编写递归函数的正确方法

int greaterThanFistIndex(int *v,int n){
    int a;
    if(n == 1){
        return 0;
    }else{
        a = greaterThanFistIndex(v,n-1);
        if(v[0] < v[n-1]){
            a++;
        }
    }
    return a;
}

[3,5,1,6]的输出应为2

1 个答案:

答案 0 :(得分:0)

  

我不确定这是否是编写递归函数的正确方法

代码看起来 OK ,但它打破了使用递归的精神。 1

可以通过简单的循环而不是n递归调用来完成此类代码。

int greaterThanFistIndex_iterate(const int *v,int n){
  count = 0;
  for (int i = 1; i<n; i++) {
    if (v[i] > v[0]) count++;
  }
  return count;
}

可以在每个步骤中将问题减半。至少,它们将只有log2(n)递归深度,而不是OP代码中的n

static int greaterThanFistIndex_r_helper(const int *v,int n, int first){
  if (n <= 0) {
    if (n == 0) return 0;
    return *v > first;
  }
  int first_half = n/2; 
  int second_half = n - first_half; 
  return greaterThanFistIndex_r_helper(v, first_half, first) +  
      greaterThanFistIndex_r_helper(v + first_half, second_half, first);
}

int greaterThanFistIndex_r(const int *v,int n){
  if (n <= 0) return 0;
  return greaterThanFistIndex_r_helper(v+1, n, *v);
}

一些编译器将检测OP的构造并执行尾端递归优化,但我认为简单的循环是一种更好的方法。


在有意义时使用递归。尽可能使用循环。

注意:在数组大小和索引编制方面,size_tint更好。 (此处未显示)


1 n <= 0的代码失败。
更好的功能签名应该是size_t greaterThanFistIndex(const int *v, size_t n)