您好我正在学习C中的递归,我正在尝试找到元素的总和。
这是我的主要内容:
int main()
{
int arr[] = {1,2,3,4,5};
int sum;
sum = arr_sum(arr,4);
printf("\nsum is:%d",sum);
return 0;
}
我的递归函数:
//n is the last index of the array
int arr_sum( int arr[], int n )
{ // must be recursive
int sum = 0;
//base case:
if (n < 0) {
return sum;
} else{
sum = sum + arr[n];
}
//make problem smaller
arr_sum(arr,n-1);
}
输出结果为:
sum is :0
答案 0 :(得分:14)
试试这个递归函数:
int arr_sum( int arr[], int n ) {
if (n < 0) {
//base case:
return 0;
} else{
return arr[n] + arr_sum(arr, n-1);
}
}
你需要将你的第n个案例添加到你的n-1案例中,直到你找到基本案例。
答案 1 :(得分:5)
你可以添加第三个参数,这是到目前为止计算的运行总数(从0
开始)。
递归调用函数时,传递运行总计。
int arr_sum( int arr[], int n, int sum )
{ // must be recursive
if (n < 0) {
return sum;
}
sum += arr[n];
return arr_sum(arr, --n, sum);
}
或者,您可以将其更改为不需要传递sum
变量。
int arr_sum( int arr[], int n )
{ // must be recursive
if (n < 0) {
return sum;
}
return arr[n] + arr_sum(arr, n - 1);
}
这样,它类似于在Fibonacci序列中找到一个数字。
答案 2 :(得分:3)
尝试此程序的修改版本,并以笔/纸的方式进行处理。希望它有所帮助。
#include <stdio.h>
//n is the last index of the array
int
arr_sum(int arr[], int n )
{
//base case:
if (n == 0) {
return arr[0];
}
return (arr[n] + arr_sum(arr,n-1));
}
int
main(void)
{
int arr[] = {1,2,3,4,5};
int sum;
sum = arr_sum(arr,4);
printf("\nsum is:%d\n",sum);
return 0;
}
答案 3 :(得分:1)
你没有从其他部分归还任何东西。你也从那里回来了。 等。
return arr_sum(arr,n-1)+arr[n];
所以这会一次又一次地调用该函数,直到n为零。
你知道了吗?答案 4 :(得分:0)
代码的问题在于,每次递归函数调用时,它都会将总和初始化为0
。
在解决问题的递归方法之外声明sum
。