2015-05-09 128 views
2

這裏使用Java,遞減運算符是一個遞歸funtion -在遞歸函數

private void printVar01(int t){ 
    if(t != 0){ 
     logp.info("o: "+t); 
     printVar01(t-1); 
    } 
} 

相同funtion有輕微的修改 -

private void printVar02(int t){ 
    if(t != 0){ 
     logp.info("o: "+t); 
     printVar02(t--); 
    } 
} 

如果我通過像4,printVar01作品整數值如預期的那樣,在連續的recrsive調用中t遞減到0,最終導致程序退出。

使用printVar02,t值爲4.

爲什麼?我假設這與變量賦值和/或值如何傳遞給函數有關。

+1

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html –

+0

是的,我應該讀過那個文檔兩次:)。此外 - http:// stackoverflow。com/questions/484462 /在i-and-i-in-a-loop中的差異 –

回答

2

聲明printVar(t--)執行後只使用--t代替T--

private static void printVar02(int t){ 
if(t != 0){ 
    logp.info("o: "+t); 
    printVar02(--t); 
} 
+0

是的,如果方法名稱是'printVar'而不是'printVar02',這是正確的。 –

+1

,他的意思是,當他說「這是一個遞歸功能」 我確信他只是測試它,爲什麼他使用01和02 – DoubleMa

3

t-1不改變tt--

  • t-1爲您提供了新的價值,而不會影響t
  • t--實際值給你t比下降的t

我覺得printVar02應該正常工作,並在價值printVar01值保持相同。


對於DoubleMa

實際上01將評論作品不是02,在01 t的變化,但在02 功能正在改變T的值之前自稱,他只是 需要使用--t;

我也絕對懷疑遞歸調用。

如果你的意思是printVar = printVar01 = printVar02

如果您呼叫printVar遞歸比t-1將作爲遞歸調用將使其工作在t--它會通過每一個,因爲它是一個使用後減預減量--t,而不是時間相同的值4

+2

實際上01將不工作02,在01 t正在改變,但在02中該函數在改變T的值之前調用自己,他只需要使用--t; – DoubleMa

2

後減量法令值1。因此每次4被傳遞給函數。
使用應該用-t代替先做減量。