递归调用流 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
。算法基本上是:

  • 是否只剩下一个字符需要组合?
    • 如果是这样,那么只有一种方法可以将它与已经洗牌过的字符组合在一起,所以组合它,打印结果,并更新计数
    • 如果没有,请查看尚未组合的字符列表。依次将每个字符作为组合中的下一个字符,然后对其余未组合的字符重复此过程,直到只剩下一个字符

您的程序执行所有置换,而不是所有组合。共有n!(其中n个为阶乘)以及程序进行n!次调用。递归表示方法调用的堆栈。请记住,每个递归步骤对应于每个堆栈项。每个堆栈项保留其局部变量。现在让我们一步一步地回顾流程。例如,让n=“abc”.length=3-->!n=1*2*3=6个递归调用。当var end.length打印abc时,递归结束 返回递归树1级 步骤4 步骤5基本情况-->打印acb 返回递归树1级 返回递归树1级 步骤6.递归 第7步递归 步骤8基本情况-->打印bac 返回递归树1级 第9步递归 步骤10基本情况-->打印bca 返回递归树1级 返回递归树1级 步骤11.递归 第12步递归 步骤13基本情况-->打印cab 返回递归树1级 第14步递归 步骤15基本情况-->打印cba 返回递归树1级 返回递归树1级 结束。 从这个流程中,您可以将“递归步骤”想象为推操作,“返回1级”想象为堆栈上的pop操作,并遍历流程/代码

下面是对调用的详细分析,您可以通过调试来理解或对调用进行分析

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. 步骤1:递归级别1 beg=“” end=“abc” cntr=0 i=0 n=“bc” 步骤2:递归级别2 beg=“a” end=“bc” cntr=0 i=0 n=“c” 步骤3:递归级别3 beg=“ab” end=“c”,这是一个基本情况-->打印beg+end=abc cntr=0 i=0 返回递归级别2 步骤4:递归级别2 beg=“a” end=“bc” cntr=1 i=1打印beg+end=acb cntr=1 返回递归级别2 返回递归级别1 步骤6:递归级别1 beg=“” end=“abc” cntr=1 i=1 n=“ac” 步骤7:递归级别2 beg=“b” end=“ac” cntr=2 i=0 n=“c” 步骤8:递归级别3 beg=“ba” end=“c”,这是一个基本情况-->打印beg+end=bac cntr=2 i=0 n=“c” 返回递归级别2 步骤9:递归级别2 beg=“b” end=“ac” cntr=3 i=1 n=“a” 步骤10:递归级别3 beg=“bc” end=“a”,这是一个基本情况-->打印beg+end=bca cntr=3 i=1 n=“c” 返回递归级别2 返回递归级别1 步骤11:递归级别1 beg=“” end=“abc” cntr=4 i=2 n=“ab” 步骤12:递归级别2 beg=“c” end=“ab” cntr=4 i=0 n=“b” 步骤13:递归级别3 beg=“ca” end=“b”,这是一个基本情况-->打印beg+end=cab cntr=0 i=0 返回递归级别2 步骤14:递归级别2 beg=“c” end=“ab” cntr=5 i=1 n=“a” 步骤15:递归级别3 beg=“cb” end=“a”,这是一个基本情况-->打印beg+end=cba cntr=6 i=1 返回递归级别2 返回递归级别1 结束。
你不明白吗?你有没有试过逐步理解它?你了解递归吗?当一个方法在它的体内调用它自己时,那就是递归。还有什么你不明白的? 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.