递归调用流 import java.io.*; 阶级组合 { 静态int cntr=0; 公共静态void main(字符串args[])引发IOException { 组合调用=新组合(); BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); System.out.print(“输入字符串:”); 字符串n=br.readLine(); call.comb(“,n); System.out.println(“组合数为:“+cntr”); } 公共空梳(字符串beg、字符串end)引发IOException { 如果(end.length()
如果我理解正确,递归调用流 import java.io.*; 阶级组合 { 静态int cntr=0; 公共静态void main(字符串args[])引发IOException { 组合调用=新组合(); BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); System.out.print(“输入字符串:”); 字符串n=br.readLine(); call.comb(“,n); System.out.println(“组合数为:“+cntr”); } 公共空梳(字符串beg、字符串end)引发IOException { 如果(end.length(),java,recursion,Java,Recursion,如果我理解正确,comb获取一个字符串并显示该字符串中的字符可以重新排列的所有方式。例如,如果您输入“abc”,程序将给出以下输出: import java.io.*; class combination { static int cntr = 0; public static void main(String args[]) throws IOException { combination call = new combination();
comb
获取一个字符串并显示该字符串中的字符可以重新排列的所有方式。例如,如果您输入“abc”
,程序将给出以下输出:
import java.io.*;
class combination
{
static int cntr = 0;
public static void main(String args[]) throws IOException
{
combination call = new combination();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter a String : ");
String n = br.readLine();
call.comb("",n);
System.out.println("Number of combinations are : "+cntr);
}
public void comb(String beg, String end) throws IOException
{
if (end.length()<=1)
{
cntr++;
System.out.println(beg+end);
}
else
{
for (int i=0;i<end.length();i++)
{
String n = end.substring(0,i)+end.substring(i+1);
comb(beg + end.charAt(i),n);
}
}
}
}
这里的部分问题是,comb
的名称不太清楚发生了什么。如果我维护此代码,我会将beg
重命名为combinedChars
,将end
重命名为uncombinedChars
(或者remainingChars
),因为函数的工作原理是在每个递归级别将单个字符从end
移动到beg
。算法基本上是:
- 是否只剩下一个字符需要组合?
- 如果是这样,那么只有一种方法可以将它与已经洗牌过的字符组合在一起,所以组合它,打印结果,并更新计数
- 如果没有,请查看尚未组合的字符列表。依次将每个字符作为组合中的下一个字符,然后对其余未组合的字符重复此过程,直到只剩下一个字符
你不明白吗?你有没有试过逐步理解它?你了解递归吗?当一个方法在它的体内调用它自己时,那就是递归。还有什么你不明白的? Step 1. Recurse Step 2 Recurse Step 3 Base case --> print abc Go 1 level back on the recursion tree Step 4 Step 5 Base case --> print acb Go 1 level back on the recursion tree Go 1 level back on the recursion tree Step 6. Recurse Step 7 Recurse Step 8 Base case --> print bac Go 1 level back on the recursion tree Step 9 Recurse Step 10 Base case --> print bca Go 1 level back on the recursion tree Go 1 level back on the recursion tree Step 11. Recurse Step 12 Recurse Step 13 Base case --> print cab Go 1 level back on the recursion tree Step 14 Recurse Step 15 Base case --> print cba Go 1 level back on the recursion tree Go 1 level back on the recursion tree end. Step 1: Recursion Level 1 beg = "" end = "abc" cntr = 0 i = 0 n="bc" Step 2: Recursion Level 2 beg = "a" end = "bc" cntr = 0 i = 0 n = "c" Step 3: Recursion Level 3 beg = "ab" end = "c", It's a base case --> Print beg+end = abc cntr = 0 i = 0 Go back to Recursion level 2 Step 4: Recursion Level 2 beg = "a" end = "bc" cntr = 1 i = 1 Print beg+end = acb cntr = 1 Go back to Recursion level 2 Go back to Recursion level 1 Step 6: Recursion Level 1 beg = "" end = "abc" cntr = 1 i = 1 n = "ac" Step 7: Recursion Level 2 beg = "b" end = "ac" cntr = 2 i = 0 n = "c" Step 8: Recursion Level 3 beg = "ba" end = "c", It's a base case --> Print beg+end = bac cntr = 2 i = 0 n = "c" Go back to Recursion level 2 Step 9: Recursion Level 2 beg = "b" end = "ac" cntr = 3 i = 1 n = "a" Step 10: Recursion Level 3 beg = "bc" end = "a", It's a base case --> Print beg+end = bca cntr = 3 i = 1 n = "c" Go back to Recursion level 2 Go back to Recursion level 1 Step 11: Recursion Level 1 beg = "" end = "abc" cntr = 4 i = 2 n="ab" Step 12: Recursion Level 2 beg = "c" end = "ab" cntr = 4 i = 0 n = "b" Step 13: Recursion Level 3 beg = "ca" end = "b", It's a base case --> Print beg+end = cab cntr = 0 i = 0 Go back to Recursion level 2 Step 14: Recursion Level 2 beg = "c" end = "ab" cntr = 5 i = 1 n = "a" Step 15: Recursion Level 3 beg = "cb" end = "a", It's a base case --> Print beg+end = cba cntr = 6 i = 1 Go back to Recursion level 2 Go back to Recursion level 1 end.