我覺得這段代碼是遞歸的一個很好的例子。 它產生與0
和1
和長度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"
。沒有進程正在運行。
如果'n <= 0,方法*返回*,純粹且簡單。 –
基本情況是n == 0,遞歸情況是n> 1。我不確定你在問什麼。 – wvdz
我不確定你想要達到什麼目的。 當n == 0時它什麼也不做,它會返回。當n == 0時你想要做什麼? 你也在同一個循環中調用doSomething()兩次沒有錯,但看起來很奇怪。 – Timmeey