2013-07-22 39 views
1
#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.我懷疑是如何使用堆棧內存。無法解密輸出

回答

1

你會與下面的函數實現得到相同的結果:

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)呼叫保持不變。

0

在每個遞歸調用f()我表示n和用另外的 ' 所以 N = 12345,A = 5 N'= 1234,A」 = 4 N ''= 123, ''= 3 '''=''='','''=''='''=''''='''''''=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''是靜態的)

答案是A + A」 + A '' + ... = 15

注:a不需要是靜態的。 int a = 0;會做。

2

讓我們假設在該計算機:

  • F(12345)
    • 使int a,設置爲0(如靜態)
    • 一個= 12345%10 + F(1234)
    • 筆記程序計數器,所以我們記得回來
      • F(1234)
      • 一個= 1234%10 + F(123)
      • 音符程序計數器,因此,我們記得在那裏回來
        • F(123)
        • A = 123%10 + F(12)
        • 記程序計數器,因此,我們記得在那裏回來
          • F(12)
          • A = 12%10 + F(1)
          • 音符程序計數器,因此,我們記得在那裏回來
            • F(1)
            • 一個= 1%10 + F(0)
            • 音符程序計數器,因此,我們記得在那裏回來
              • F(0)
              • 返回一個,即0(由於我們沒有改變它尚未)
            • 返回一個= 1%10 + 0 = 1
          • 回報= 12%10 + 1 = 3
        • 返回A = 123%10 + 3 = 6
      • 回報= 1234%10 + 6 = 10
    • 回報= 12345%10 + 10 = 15
工作完成。

0

詳細的堆棧使用情況依賴於編譯器。但是我們可以粗略地說,對於函數f的每次調用,「int n」被壓入棧中,因此佔用int的大小。 如果您遞歸調用函數N次,則堆棧使用量將達到N * sizeof(int)個字節。 您也可能需要爲返回值添加一些字節。