我正在学习递归。作为练习,我试图递归地找到数组的最大值。
int recursive (int *arr, int n, int largest) {
if(n==0)
return largest;
else {
if (*(arr+n)>largest) {
largest = *(arr+n);
recursive(arr, n-1, largest);
}
}
}
int main() {
int length = n-1;
int largest = v[0];
int z = recursive(arr, length, largest);
printf("\n%d", z);
}
我遵循了您的建议,使用指针而不是数组,并且该程序看起来可能更好。但是它仍然没有这样做,没有正确显示最大值。我认为逻辑是正确的。
答案 0 :(得分:0)
通常在C 中,您无法声明其大小在编译时未知的数组,因此int v[n]
是危险代码。
根据您的编译器和编译器的设置,这可能是编译错误,也可能是错误。
对于此类问题,您需要了解指针和dynamic memory allocation。
旁注:在C99之后,有类似Variable Length Arrays之类的东西,但是规则有些高级。
对于pass an array to a function,您还可以给数组一个指针作为参数:
int z = recursion(v, n, v[0]);
代替:
int z = recursion(v[n], n, v[0]);
答案 1 :(得分:0)
首先要注意编译器警告,当您输入else部分时,递归函数不会返回值。
现在,第二件事是请不要使用*(arr + n)之类的难以理解的东西,而应使用arr [n],同时在将数组用作函数参数时,仅使用int arr []即可。调用函数而不是int * arr(在第一个版本中,显然应该传递一个数组)。
第三件事是命名您的事物,而不是int recursive
描述函数在做什么,例如int maxElemRecursive
因此您的递归函数应该类似于
int maxElemRecursive(int arr[],int n,int largest)
{
if(n==0) return largest;
if(arr[n] > largest) // No need for else because return largest; would've returned value;
{
largest = arr[n];
}
return maxElemRecursive(arr,n-1,largest); // You have to return the value of the function.
// You still pass the array with just arr.
}