我正在尝试编写一个对数组进行求和的程序。如果我在函数中放入 printf ,它会返回正确的结果,但最终结果不正确。为什么?
#include <stdio.h>
int summ(int a[100],int n)
{
static int sum=0;
static int i=0;
if(i<n)
{
sum+=a[i];
++i;
return (summ(a,n)+sum);
}
}
int main()
{
int b[100];
int n,i,suma;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
suma=summ(b,n);
printf("Suma=%d",suma);
return 0;
}
最佳答案
在启用警告的情况下编译代码应产生以下输出:
program.c:13:1: warning: control may reach end of non-void function [-Wreturn-type]
这意味着您的 summ
函数缺少基本情况 - 即,它没有指定达到 n
后应返回的内容。
解决此问题后,您的代码将开始返回正确的值。但是,您的函数仍然需要一些修复,因为您不应该在其中使用静态变量。函数中的任何静态变量都会使函数不可重入,这是非常糟糕的。特别是,您的函数只能运行一次;第二次调用会产生错误,因为 i
和 sum
都无法重置。
这是您要构建的内容的简单递归实现:
int summ_impl(int a[], size_t i, size_t n) {
return i != n ? a[i] + summ_impl(a, i+1, n) : 0;
}
int sum(int a[], size_t n) {
return summ_impl(a, 0, n);
}
关于c - C 中的递归求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009821/