递归 - 未按预期返回值

问题描述 投票:0回答:1

我目前正在编写一个程序,以返回从自身减去的数字的所有加法(例如,如果 3 是数字,则输出应该是 6 (3+2+1)。本质上,我试图让函数返回数字的排列,但使用加法,而不是乘法。这对于递归函数来说似乎是一个完美的情况(我很难理解这一点),我希望返回值不相关(在期间)。 while 循环),因为信息直接包含在变量中(具体来说,静态 b)然而,当我将函数中的 while 循环更改为 b 以外的任何值时,函数返回错误的值到 main( ) - 它总是 0。更令人困惑的是,当我执行 b 的 printf 时,就在(第二个 - while 循环之外)b 返回值返回之前,我的函数打印正确的值(无论返回值如何)为什么我的函数必须在 while 循环(第一个返回函数)中返回 b 才能返回正确的值,即 55 (10+9+8+7+6+5+4+3+2+1)。 +0)?

代码如下,可以正常运行。

#include <stdlib.h>
#include <stdio.h>

int sumyears(int a)
{
static int b=0;
while(a>0)
{
b+=a;
sumyears(a-1);
return b;  //Program works correctly when I return b, but not when I return any other value, including a
}
printf("%d", b); //Program will always print correct value, but return different values based upon the return value in the while loop
return b;
}

int main()
{
    printf("%d", sumyears(10));
}
function variables recursion return
1个回答
0
投票

对于递归函数来说似乎是一个完美的情况(我很难理解)

您想要计算

n
之前的所有整数的总和。

  • 如果
    n == 0
    ,那么总和显然是
    0
  • 否则,
    (0 + 1 + ... + n) = (0 + 1 + ... + (n - 1)) + n
    ,即
    sumOfIntsUpTo(n) = sumOfIntsUpTo(n - 1) + n

作为递归函数:

#include <stdlib.h>
#include <stdio.h>

int sumIntsUpTo(int a) {
  return (a <= 0) ? 0 : (sumIntsUpTo(a - 1) + a);
}
int main() {
  printf("%d", sumIntsUpTo(10));
}

当然有一个众所周知的显式公式

我不知道你从哪里想到在递归函数中使用

static
的想法,但我建议放弃这个源(删除链接/烧掉这本书/不要和提出这个建议的奇怪人说话) ).

© www.soinside.com 2019 - 2024. All rights reserved.