#include<stdio.h>
int f(int n)
{
static int a;
if(n)
a=n%10+f(n/10);
return a;
}
int main()
{
printf("%d",f(12345));
}
輸出是15.我懷疑是如何使用堆棧內存。無法解密輸出
#include<stdio.h>
int f(int n)
{
static int a;
if(n)
a=n%10+f(n/10);
return a;
}
int main()
{
printf("%d",f(12345));
}
輸出是15.我懷疑是如何使用堆棧內存。無法解密輸出
你會與下面的函數實現得到相同的結果:
int f(int n) {
if (n)
return n%10 + f(n/10);
return 0;
}
在你的情況的行爲將是相同的,這就是爲什麼。首先,當初始化靜態int變量時,它的默認值是0(與函數體內的int聲明不同)。其次,n的唯一價值,當你的函數只需要a
值,不分配爲0,因爲當行a=n%10 + f(n/10)
評估,遞歸f()
調用發生以前分配a
,其價值之前f(0)
呼叫保持不變。
在每個遞歸調用f()
我表示n和用另外的 ' 所以 N = 12345,A = 5 N'= 1234,A」 = 4 N ''= 123, ''= 3 '''=''='','''=''='''=''''='''''''=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''是靜態的)
答案是A + A」 + A '' + ... = 15
注:a
不需要是靜態的。 int a = 0;
會做。
讓我們假設在該計算機:
int a
,設置爲0(如靜態)詳細的堆棧使用情況依賴於編譯器。但是我們可以粗略地說,對於函數f的每次調用,「int n」被壓入棧中,因此佔用int的大小。 如果您遞歸調用函數N次,則堆棧使用量將達到N * sizeof(int)個字節。 您也可能需要爲返回值添加一些字節。