返回大于数组第一个索引的数字的递归函数
我有一个可以解决问题的函数,但是我不确定这是否是编写递归函数的正确方法
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
答案 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_t
比int
更好。 (此处未显示)
1
n <= 0
的代码失败。
更好的功能签名应该是size_t greaterThanFistIndex(const int *v, size_t n)