递归和静态变量
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 也是。
代码的目标: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 也是。