首页 > 解决方案 > 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;
}

标签: c

解决方案


在启用警告的情况下编译代码应该会产生以下输出:

program.c:13:1: 警告:控制可能到达非空函数的结尾 [-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);
}

推荐阅读