2017-01-15 75 views
-2
public void doSomething(int n){ 
    if (n > 0){ 
      doSomething(n-1); 
      System.out.print(n); 
      doSomething(n-1); 
    } 
} 

如果我寫:doSomething(3),終端打印1213121,但我不能遵循遞歸過程,因爲只有一個基本情況而沒有其他情況。如果n == 0,函數會做什麼?那麼如何進行遞歸步驟呢?如何在沒有其他情況下解決此Java遞歸?

+2

如果'n <= 0,方法*返回*,純粹且簡單。 –

+0

基本情況是n == 0,遞歸情況是n> 1。我不確定你在問什麼。 – wvdz

+0

我不確定你想要達到什麼目的。 當n == 0時它什麼也不做,它會返回。當n == 0時你想要做什麼? 你也在同一個循環中調用doSomething()兩次沒有錯,但看起來很奇怪。 – Timmeey

回答

2

遞歸不需要有base的情況。它只需要兩兩件事:

  1. 點程序可以(在這種情況下i == 0)終止
  2. 每次遞歸調用運行在一個方向接近該點(doSomething(n - 1)在這種情況下,而不是doSomething(n + 1)

如果您更願意認爲在base方式的情況下,你的代碼是完全一樣:

public void doSomething(int n){ 
    if (n <= 0) { 
     return; 
    } 

    doSomething(n-1); 
    System.out.print(n); 
    doSomething(n-1); 
} 

如果您有興趣,您的代碼邏輯類似於二叉樹的inorder traversal的遞歸版本。您可以參考https://en.wikipedia.org/wiki/Tree_traversal#In-order獲取更多見解。

0

如果n == 0,函數會做什麼?

絕對沒有。

那又如何進行遞歸步驟呢?

它不會繼續。

而且它不應該繼續。當n <= 0代碼不應該進一步遞歸。

有人建議你使用調試器來運行代碼來幫助你可視化發生了什麼事情。這應該也可以幫助你解決這個概念問題:

我不能遵循遞歸過程,因爲只有一個基本情況,並且沒有else的情況。

您誤解了遞歸的基礎知識。它不需要else的情況。什麼是實際上要求是一種停止遞歸的方法。一個else案件是一種可能性,但也有其他種類。

或者......把它帶回來給你的榜樣......你的代碼是相同的:

public void doSomething(int n){ 
    if (n > 0){ 
      doSomething(n-1); 
      System.out.print(n); 
      doSomething(n-1); 
    } else { 
      // this is a comment 
    } 
} 

現在有一個else情況下...這是一個空塊。或者,您可以將冗餘return聲明放入該塊中。 (我想你可以算出爲什麼它是多餘的!)

0

我覺得這段代碼是遞歸的一個很好的例子。 它產生與01和長度5遞歸的,圖案的結果的所有組合:

結果:

00000 
00001 
00010 
00011 
00100 
00101 
00110 
00111 
01000 
01001 
01010 
01011 
01100 
01101 
01110 
01111 
10000 
10001 
10010 
10011 
10100 
10101 
10110 
10111 
11000 
11001 
11010 
11011 
11100 
11101 
11110 
11111 

代碼:

class Stringhelper { 
    public Stringhelper() { 
    } 
    public String getstring(String string,int beginning,int ending) { 
     if (string.length() != 0) { 
     String newstring=""; 
     for (int iter=Math.abs(beginning); iter < ending && iter < string.length(); iter=iter+1) { 
       newstring=newstring+Character.toString(string.charAt(iter)); 
     } 
     return newstring; 
     } 
     else { 
     return ""; 
     } 
    } 
} 



public class Counter { 
    public String abil=""; //Possible Combinations 
    public int iter=0; 
    public Stringhelper shelper=new Stringhelper(); 
    public void loop(int iter) { 
     for (int i=0; i < 2; i++) { 
       abil=shelper.getstring(abil,0,iter); //Crop everything until this char, if string was 010, for and iter is 2 : 01+result of this loop 
       abil=abil+Integer.toString(i); 
       if (iter==4) { //0,1,2,3,4=Length 5 
        System.out.println(abil); 
       } 
       else { 
        loop(iter+1); 
       } 
     } 
    } 
    public Counter() { 
     loop(iter); 
    } 
    public static void main(String args[]){ 
     new Counter(); 
    } 
} 

它是這樣工作的是:

對於例如長度爲2 * 2 = 4個組合。

是:

00 
01 
10 
11 

但它是如何產生的?

它的工作原理如下:

第一次調用:循環(0)被執行。

該循環實際上是i=0。它寫下來。字符串是"0"。現在它啓動loop(1)。這個函數起初有i=0,加上它,現在字符串是"00",它注意到它已經是第二個循環了,所以它打印出來了,但是沒有再次啓動函數。打印出"00"。現在循環進一步。 i=1。首先它試圖截止所有的字符,所以在"00"之外,那裏只保留第一個零,所以它的"0"。現在附加"1",String爲"01"。它注意到它已經是第二個循環了,所以它會打印它,但不會再次啓動該功能。打印出"01"。這個功能已經繼續,所以它回到了第一個功能。那裏的循環現在運行得更遠,直到現在它試圖切斷所有的字符,所以現在我們有一個清除的字符串""。它啓動loop(1)。該函數首先有i=0,將它添加到字符串中,現在字符串是"10",它注意到它已經是第二個循環了,所以它打印它但不再次啓動該函數。打印出"10"。現在循環進一步。 i=1。首先它試圖截止所有字符,所以出於"10",那裏只保留第一個字符,所以它的"1"。現附加"1",字符串爲"11"。它注意到它已經是第二個循環了,所以它會打印它,但不會再次啓動該功能。打印"11"。沒有進程正在運行。

相關問題