2010-06-18 24 views
4

你能告訴我這個java代碼是如何工作的嗎? :
循環內部的遞歸,它是如何工作的?

public class Main { 
    public static void main (String[] args) { 
     Strangemethod(5); 
    } 
    public static void Strangemethod(int len) { 
     while(len > 1){ 
      System.out.println(len-1); 
      Strangemethod(len - 1); 
     } 
} 
} 

我試圖調試它,並按照代碼一步一步,但我不明白。

更新:對不起,我沒有提到,我知道這個代碼的結果,但只是想知道執行的步驟..

+2

@Nikita,我想OP沒有寫,只是發現它在某個地方,並試圖理解它。 – 2010-06-18 15:02:36

+6

@Nikita Rybak;對試圖學習如何編碼的人很好。 :-) – 2010-06-18 15:04:45

+0

@ Nikita,我沒有寫它,我只是要求知道執行的步驟.. – 2010-06-18 15:09:35

回答

13

那將打印4 3 2 1 1 1 1 1 1 ...

而陷入一個循環,因爲從來都沒有在while循環的範圍修改LEN。第一個調用(len = 5,4,然後是3)經歷一次循環迭代,並且等待Strangemethod返回。當len = 2時,while循環調用strangemethod(1),並且由於len不大於1,所以while循環結束並且該調用返回。但len在剩下的最底部的循環中仍然是2,所以它再次調用了奇怪的方法(2)。然後再次。然後再次。如果()會比while()更適合。

+1

或者可能會在循環中遞減len,這會產生一種值的樹。 – 2010-06-18 15:12:21

+0

@Dave一個三角形。 – 2010-06-18 15:20:16

+0

@Dave:Strangemethod(5) - > 4 3 2 1 1 2 1 1 3 2 1 1 2 1 1(像湯姆說的那樣,一個三角形) – JAB 2010-06-18 15:21:38

2

編輯:對不起,我第一個回覆didnt 意識到這一點。 。它將導致無限循環

下面是一個簡單的流 - 爲例如LEN = 5

public static void Strangemethod(5) { 
      while(5 > 1){ 
       System.out.println(5-1); 
       Strangemethod(5 - 1); 
      } 
public static void Strangemethod(4) { 
      while(4 > 1){ 
       System.out.println(4-1); 
       Strangemethod(4 - 1); 
      } 
public static void Strangemethod(3) { 
      while(3 > 1){ 
       System.out.println(3-1); 
       Strangemethod(3 - 1); 
      } 
    public static void Strangemethod(2) { 
      while(2 > 1){ 
       System.out.println(2-1); 
       Strangemethod(2 - 1); 
      } 
    public static void Strangemethod(1) { 
      while(1 > 1){//goes back to original(above) call and then an infinite loop since len was never decremented 

      } 

打印4 3 2 1 1 .....

+0

但是在'Strangemethod'的單個調用中,'len'不會遞減。 – 2010-06-18 15:05:06

+0

@VJ:這是一個很棒的答案,謝謝你輸入! – 2010-06-18 15:05:55

+0

...然後調用'Strangemethod(2)'將永遠循環。 – 2010-06-18 15:07:39

1

你不說你期望的代碼。但是,值得注意的是,len變量不改變Strangemethod方法中的值 - 它可能已被聲明爲final。可能你想要做的是減少它與--len;(相當於len = len - 1;)。

1

嘗試在Strangemethod(len - 1);之後加len--;。那麼它不會讓你陷入無限循環。或者,你可以做

System.out.println(--len); 
Strangemethod(len); 
+0

不妨在遞歸調用之前將'len-1'改爲'len'並放置'len - '。 – 2010-06-18 15:08:06

+0

@Matthew:的確,儘管這裏有多種使用'--'的方法,正如我剛剛添加的另一個變體所示。 – JAB 2010-06-18 15:11:04

+0

非常真實......或與M.H.課程詢問該方法的作用是什麼......它可能是最好的len - ;現在就在它自己的路線上。 (你可以玩得開心,甚至可以將它移動到'while'表達式中。) – 2010-06-18 15:22:12

2

如果我沒有弄錯,是不是會造成無限循環?一旦奇怪方法(1)返回奇怪方法(2)將再次打印1,然後再次調用奇怪方法(1)。

在奇怪的方法調用之後,你是否忘記遞減len?

0

此代碼將永久循環。

len - 1的結果永遠不會存儲在while循環中,因此它不能退出,並且len = 2它只會在那裏輸出1。

在遞歸函數中使用while是很少見的。我通常希望看到在其位的if,這將使您的輸出:

4 
3 
2 
1 

如果你確實需要while那麼我重寫這樣的循環:

while(len > 1) 
{ 
    len--; 
    System.out.println(len); 
    Strangemethod(len); 
} 

這將輸出:

4 
3 
2 
1 
1 
2 
1 
1 
3 
2 
1 
1 
2 
1 
1 
-3

另外,我覺得應該有人指出,LEN永遠不會減少,所以你得到一個無限循環。我發現到目前爲止只有7人提到過。