2013-07-08 133 views
1

我正在通過下面的代碼,我不明白的部分是如何「離開」n值成爲2,5和10.我理解遞歸調用的第一部分,直到n == 0,並且返回將控件移動到else部分並打印(0%2)。那之後程序不應該停止嗎?調試遞歸函數

void fun2(int n){ 
    System.out.println("Entering"+n); 
    if(n==0) 
     return; 
    else{ 
     fun2(n/2); 
     System.out.print("Leaving"+n+"---->");  
     System.out.println(n%2); 
    } 
} 

輸出:

所有的
 Entering5 
     Entering2 
     Entering1 
     Entering0 
     Leaving1---->1 
     Leaving2---->0 
     Leaving5---->1 
     Leaving10---->0 
+1

這是一種方式進行調試。另一種方法是在調試器中逐行執行。 –

+0

另外,這段代碼的行爲與你期望的行爲有什麼不同? –

+0

我不知道如何離開獲得「n」進入的價值。我幾乎不得不使用遞歸來追蹤這似乎是一個相當混亂的任務。你能解釋一下嗎?這不是我的代碼。我只是添加了打印 –

回答

1

首先,我認爲,你有你的輸出錯誤。當我通過調用fun2()運行上面的代碼,其值爲5時,我得到所有表示的輸出,除了行Leaving10---->0。您確定這是在fun2()函數的輸出中,或者是您撥打fun2()的代碼位置中的工件嗎?也許你打電話fun2()函數的值爲10,並從輸出Entering10的第一行開始?

該函數通過計算每個二進制數字的值來工作。 System.out.println(n%2);

101 = (1*2^2) + (0*2^1) + (1*2^0) = 4 + 0 + 1 = 5 

每次迭代計算的2下一個更低的功耗,因爲它被稱爲:這是使用%運算,在else塊的最後一行被稱爲模運算符(又稱餘運算符)來完成與n/2。請記住,你在這裏處理整數除法,所以沒有餘數。 1/2 = 0,不是0.5。但是,整數模數函數可以很好地工作,所以1%2 = 1(1除以2 = 0,餘數爲1)。

這裏的一個詳細的研究在該方法的每一遞歸層次:

  1. N = 5,N/2 = 2,FUN2(2)中,n%2 = 1
  2. n = 2時,正/ 2 = 1,FUN2(1)中,n%2 = 0
  3. N = 1,N/2 = 0,FUN2(0),N%2 = 1
  4. n = 0時,方法返回

將各個控制檯輸出放在一起時,會得到101,這是二進制f (五)

如果你要呼籲fun2()爲10的參數值,你會看到輸出1010

1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10