c - 递归和静态变量

标签 c recursion static

代码的目标:返回数字的数字之和。

以下代码对于 123 返回 24,对于 1234 返回 50,对于 12345 返回 90。(变量 Sum 是静态的)如何跟踪输出?

(6x4 = 24、10x5 = 50、15x6 = 90)

我试图了解静态变量是如何插入堆栈的。 (压入的是变量还是它的地址?)

//sum of digits using recursion
#include<stdio.h>
int find_digits(int );

int main()
{
    int num;
    printf("Enter a number\n");
    scanf("%d", &num);
    int sum = 0;
    printf("\nThe sum of the digits is %d", sum);
    sum = find_digits(num);
    printf("\nThe sum of the digits is %d", sum);
}

int find_digits(int num)
{
    int digit = num%10;
    printf("\nDigit is %d", digit);
    static int sum=0;
    sum += digit;
    printf("\nsum is %d", sum);
    if(num<=0)
    {
        printf("\n1. Num is %d and sum is %d", num, sum);
        return sum;
    }
    else
    {
        printf("\n2. Num is %d and sum is %d", num, sum);
        return (sum + find_digits(num/10)); 
    }
}

最佳答案

函数find_digits的静态变量sum分配在全局地址空间中。它在程序执行开始时初始化为零(或由链接器设置为其初始化值)。

该变量未分配在堆栈上。在您的示例中,此静态变量的被插入堆栈(调用 printf)。

每次调用 find_digits 时该变量都是相同的,也就是说,该函数仅对一个变量(内存地址)进行操作,与递归深度无关。'

以“123”作为输入,sum 首先设置为 3,然后在下一次调用 find_digits 时,它递增 2 到 5,然后递增 1 到 6,然后递归展开并求和(现在是6)加上find_digits的返回值,即sum(即6),现在是12,加上find_digits的返回值(即sum,现在是12),所以是24。

关于c - 递归和静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27775546/

相关文章:

c# - 为什么在使用静态导入时不能将扩展方法作为静态方法调用?

c++ - 将链接切割树的 C++ 实现转换为 C

c - 为什么不执行 if 条件?

c++ - 叠加在 4 channel 图像上

javascript - 将嵌套的 json 转换为 html

php - 如何根据键可用性将所有输入值分配到数组中而不会发生冲突?

c - Pthreads 和不透明类型

python - 在python中递归地向字符串添加行

c++ - 为什么编译器不能为非静态成员函数的无效使用生成解决方法

Java - 静态数组列表中对象的垃圾数组列表字段