c - C 中的递归求和

标签 c

我正在尝试编写一个对数组进行求和的程序。如果我在函数中放入 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 后应返回的内容。

解决此问题后,您的代码将开始返回正确的值。但是,您的函数仍然需要一些修复,因为您不应该在其中使用静态变量。函数中的任何静态变量都会使函数不可重入,这是非常糟糕的。特别是,您的函数只能运行一次;第二次调用会产生错误,因为 isum 都无法重置。

这是您要构建的内容的简单递归实现:

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/

相关文章:

c - C中通过文件进行多项式赋值

python - 确定(Windows)上是否存在 PID 的快速方法?

c - 在 C 中打印 long int 值

c - 如何使用 C 列出目录中除 "."和 ".."之外的文件夹?

c - "memory is 8 bytes aligned"是什么意思?

c - 为什么仍然可以读取已销毁的链表

无法将 arg 从 char 转换为 c 中的 const char

C GPIO 十六进制编号

c - 使用 fread() 将文本文件读入缓冲区 - 为什么缓冲区中的值不是每个字符各自的 ASCII 值?

c - 在 C 段错误中追加链表