C中的递归函数

Coo*_*ude 1 c variables recursion

所以下面是我的代码,我在尝试将我的知识用于递归函数时遇到了一些困难.我的程序想要使用用户输入作为最后一个数字来查找所有自然数的总和.

我试图使用递归函数,但它似乎不起作用.在我看来,问题是一旦函数再次调用它自己,整数总和似乎不记得它的初始值.有人可以帮帮我吗.

include <stdio.h>

int sum(int); 

main(){
    int a; 
    printf("Enter your number\n");
    scanf_s("%d", &a); 
    printf("The answer is %d", sum(a)); 
    getch();
}

int sum(int a){ 
    int total = 0;
    total = total + a;  /*add the new value of a*/
    a--;    /*decrease the value of a by one*/
    if (a == 0){
        return total;   /* leave the function and display this value */
    }
    else {
        sum(a); /*call this function again */
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ice 5

让我们sum()用单词写出函数的定义:

所有自然数最多的总和nn加上自然数最多的总和n-1.

请注意,此定义是递归的,因为我需要计算较小数字的总和,以便计算给定数字的总和.以此为指导,我们可以尝试这样的事情:

int sum(int n) {
    return n + sum(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用某些测试代码运行它,您将获得stackoverflow.这是因为我们没有给出基本情况来判断迭代何时停止.这个基本情况隐含在我们上面的定义中.最小的自然数为零.我们用int存储整数的类型模拟自然数.所以我们需要稍微修改我们的代码以确保我们不允许负整数:

int sum(int n) {
    if (n <= 0)
        return 0;

    return n + sum(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

我认为你遇到的部分问题是你想使用累加器.通常使用递归解决方案,这不是必需的,因为递归调用可以立即返回累积值.

分析:

让我们看一下如何使用一个例子:

void main() {
    int x = sum(3);

    printf("%d\n", x);
}
Run Code Online (Sandbox Code Playgroud)

1级

第一行调用sum()并设置n为3.

int sum(int n) {
    if (n <= 0)
Run Code Online (Sandbox Code Playgroud)

n 不小于或等于零,所以我们跳到了 return

        return 0;

    return n + sum(n - 1)
Run Code Online (Sandbox Code Playgroud)

现在我们sum()再次调用,n-1其值为2

}
Run Code Online (Sandbox Code Playgroud)

2级

现在sum()通过n设置为2 进行评估.

int sum(int n) {
    if (n <= 0)
Run Code Online (Sandbox Code Playgroud)

我们再次跳过if声明.

        return 0;

    return n + sum(n - 1);
Run Code Online (Sandbox Code Playgroud)

并且sum()调用值为1.

}
Run Code Online (Sandbox Code Playgroud)

3级

int sum(int n) {
    if (n <= 0)
Run Code Online (Sandbox Code Playgroud)

n1开始,我们跳过了if.

        return 0;

    return n + sum(n - 1);
Run Code Online (Sandbox Code Playgroud)

现在我们打电话sum(0).

}
Run Code Online (Sandbox Code Playgroud)

4级

int sum(int n) {
    if (n <= 0)
        return 0;
Run Code Online (Sandbox Code Playgroud)

由于n为0,我们返回0.这将执行返回

3级

    return n + sum(n - 1);
Run Code Online (Sandbox Code Playgroud)

在此级别上n为1,级别4返回值为0.将这些值一起添加,我们将值1返回到级别2.

2级

    return n + sum(n - 1);
Run Code Online (Sandbox Code Playgroud)

在此级别n为2,级别3返回值1.将这些值一起添加,我们将值3返回到级别1.

1级

    return n + sum(n - 1);
Run Code Online (Sandbox Code Playgroud)

在这个级别n是3和级别2返回值3.将这些加在一起,我们返回值6 main().

    printf("%d\n", x);
Run Code Online (Sandbox Code Playgroud)

最后,main()打印其值x设置为6.