Java-программы начинаются с основного. Этот принимает аргумент, который должен быть целым числом. Он хранит целое число в N. Если пользователь набрал в java и имя программы с 3
, то N будет установлено в 3. Это используется для отделения первых N букв алфавита и размещения их в элементах. (В нашем примере abc
). Затем он вызывает comb1 (abc
), то есть общедоступный comb1, указанный первым.
Далее comb1 вызывает приватную comb1 с двумя аргументами, пустой строкой и abc
.
Теперь рекурсия начинается. Private comb1 принимает префикс и строку (в первом случае пустая строка и abc
). Если строка не пуста, то это:
- печатает первый символ
- вызывает себя рекурсивно с префиксом + первый символ в качестве нового префикса и остаток в качестве новой строки и
- вызывает себя рекурсивно с тем же префиксом, что и новый префикс, и со всеми, кроме первого символа, как новая строка.
(Здесь многие люди будут слегка дрожать ... смотреть на это, держаться, быть компьютером, и смысл придет.)
(Top level)
comb1("", "abc") -> *1* a *2* comb1("a", "bc") *3* comb1("", "bc")
(Second level)
comb1("a", "bc") -> *1* ab *2* comb1("ab", "c") *3* comb1("a", "c")
comb1("", "bc") -> *1* b *2* comb1("b", "c") *3* comb1("", "c")
(Third level)
comb1("ab", "c") -> *1* abc *2* comb1("abc", "") *3* comb1("ab", "")
comb1("a", "c") -> *1* ac *2* comb1("a", "") *3* comb1("a", "")
comb1("b", "c") -> *1* bc *2* comb1("bc", "") *3* comb1("b", "")
comb1("", "c") -> *1* c *2* comb1("c", "") *3* comb1("", "")
(Fourth level)
comb1("ab", "") -> (immediate return, ending recursion)
comb1("a", "") -> (immediate return, ending recursion)
comb1("b", "") -> (immediate return, ending recursion)
comb1("", "") -> (immediate return, ending recursion)