2017-03-12 73 views
0

代碼1: -C代碼的區別?

int f(int val) { 
    int x=0; 
    while(val > 0) { 
     x = x + f(val--); 
    } 
    return val; 
} 

代碼2: -

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     x= x + g(val-1); 
    } 
    return val; 
} 

是什麼在代碼f(3)g(3)執行的區別?


Code 1對我來說很清楚。然後f(3)將繼續調用自己,越來越深,當用於跟蹤遞歸函數的空間被填滿時,我們得到堆棧溢出錯誤。

但是,我其實停留在第二碼的執行。我跑了它,並有無限循環。

另外,我還讀到val--可以寫成val-1。那麼,我怎麼在解釋val-1行時出錯,因爲他們兩人的表現都截然不同。

+2

你得到了一個無限循環,因爲'val'的值永遠不會改變'g'。你會注意到你曾經調試過它。 – StoryTeller

+0

這是一個很好的例子,紙張調試可以有所幫助。在執行的每一步中,寫下所有變量的值並決定接下來會發生什麼代碼。 –

+1

'val - '和'val-1'是兩個完全不同的東西。第一個改變'val'的值,但第二個不改變。 –

回答

1

val--相當於val = val -1,因此它將val的值減1並存儲新值(遞減)。而val -1只是減少並返回新值,而不將其存儲在變量val(不實際遞減拖尾)中。這就是爲什麼你有一個無限循環。我建議這些變化:

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     val = val - 1; 
     x= x + g(val); 
    } 
    return val; 
} 

這裏是遞減和增加運營商的參考:http://en.cppreference.com/w/cpp/language/operator_incdec

0

val--減少1 VAL並保存它放回VAL,而VAL - 1簡單地從VAL減去1這意味着你永遠不會逃脫你的while循環。