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: 警告:控制可能到达非空函数的结尾 [-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);
}
推荐阅读
- svg - 生成两种色调组合的公式是什么?
- javascript - 从数组对象数组中获取数组
- javascript - HTML组件未在电子反应应用程序中呈现
- java - android应用程序中类变量的意外行为
- svg - 为 SVG 中的所有内容切换 X 和 Y 轴?
- android - Android 11 ActivityResult 仅抛出 RESULT_CANCELED
- python - python pyzipcode库检查邮政编码是否丢失
- docker - 反向代理背后的 Gitlab 容器注册表
- c# - 从 Gmail C# Imap4Client 读取电子邮件
- apache-spark - 在 jupyter 中运行 spark.sql 查询