递归和静态变量

Recursion and static variable

代码的目标:return一个数字的数字的总和。

下面的代码returns 24 for 123, 50 for 1234, 90 for 12345. (Variable Sum is static) 如何跟踪输出?

(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)); 
    }
}

没有必要使用静态变量。该函数可能如下所示

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

int digits_sum( int x )
{
    const int Base = 10;
    int digit = abs( x % Base );

    return ( x /= Base ) ? digit + digits_sum( x ) : digit;
}

int main(void) 
{
    int x = 123456789;

    printf( "%d\n", digits_sum( x ) );

    return 0;
}

程序输出为

45

至于静态变量,那么它只在函数第一次被调用时初始化一次,并且可以被函数的所有其他调用访问。也就是说,它是函数调用之间的共享变量。您可以将其视为相对于函数体的全局变量。该变量的静态存储持续时间与具有自动存储持续时间的(本地)变量相反

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

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

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

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