代碼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
行時出錯,因爲他們兩人的表現都截然不同。
你得到了一個無限循環,因爲'val'的值永遠不會改變'g'。你會注意到你曾經調試過它。 – StoryTeller
這是一個很好的例子,紙張調試可以有所幫助。在執行的每一步中,寫下所有變量的值並決定接下來會發生什麼代碼。 –
'val - '和'val-1'是兩個完全不同的東西。第一個改變'val'的值,但第二個不改變。 –