首页 > 解决方案 > 使用递归的数组总和错误(编译和运行时)

问题描述

我被要求使用递归对数组中的数字求和,其中将提供样本输入,编译器给了我以下错误(注意,我尝试了三种方法并得到了相应的错误)。有人可以向我解释我在这里做错了什么吗?

代码 1 的错误

In file included from Runner.cpp:2:0:
Solution.h: In function 'int sum(int*, int)':
Solution.h:7:32: error: invalid conversion from 'int' to 'int*' [-fpermissive]
     totalsum = totalsum + sum(n+1,n-1);
                                ^
Solution.h:1:5: note:   initializing argument 1 of 'int sum(int*, int)'
 int sum(int input[], int n) {
     ^

代码 2 错误

Solution.h: In function 'int sum(int*, int)':
Solution.h:5:24: error: invalid conversion from 'int' to 'int*' [-fpermissive]
return input[0] + sum(n+1,n-1);
                    ^
Solution.h:1:5: note:   initializing argument 1 of 'int sum(int*, int)'
int sum(int input[], int n) { 
 ^

代码 3 错误

Runtime error

代码 1

int sum(int input[], int n) { 
if (n<=0)
{
    return 0;
};
int totalsum;
totalsum = totalsum + sum(n+1,n-1);
return totalsum;
} 

代码 2

if (n<=0)
 return 0;
return input[0] + sum(n+1,n-1);

代码 3

 if (n <= 0) 
    return 0; 
return (sum(input, n +1) + input[n - 1]); 

标签: c++compiler-errorsruntime-error

解决方案


在这个函数实现中

int sum(int input[], int n) { 
if (n<=0)
{
    return 0;
};
int totalsum;
totalsum = totalsum + `sum(n+1,n-1)`;
return totalsum;
} 

声明为 like 的第一个参数int input[]的类型为int *n + 1但是,您将整数作为递归调用中的参数传递,而不是数组

sum(n+1,n-1)

此代码段中存在相同的问题

if (n<=0)
 return 0;
return input[0] + sum(n+1,n-1);

在第二个代码片段中,似乎有超出数组的访问内存

return (sum(input, n +1) + input[n - 1]); 
                   ^^^^

此外,调用具有无限递归,因为第二个参数总是增加:n + 1.

函数可以写成

long long int sum( const int a[], size_t n ) 
{
    return n == 0 ? 0 : a[0] + sum( a + 1, n - 1 );
}

另一种方法如下

long long int sum( const int a[], size_t n ) 
{
    return n == 0 ? 0 : 
                  ( n == 1 : a[0] ? sum( a, n / 2 ) + sum( a + n / 2, n - n / 2 ) );
}

这是一个演示程序

#include <iostream>

long long int sum( const int a[], size_t n )
{
    return n == 0 ? 0
                  : ( n == 1 ? a[0] : sum( a, n / 2 ) + sum( a + n / 2, n - n / 2 ) );
}

int main() 
{
    int a[] = { 1, 2,3, 4,5, 6, 7, 8, 9, 10 };
    const size_t N = sizeof( a ) / sizeof( *a );

    std::cout << sum( a, N ) << '\n';

    return 0;
}

它的输出是

55

推荐阅读