由全排列问题引发的关于for循环里嵌套递归的思考
问题描述:求n个整数的全排列。
解决思路:
输入:n个整数的序列
步骤1:置i=0。
步骤2:置第i个位置的元素当排头。
步骤3:递归求除排头元素外的n-1个元素的全排列。
步骤4:将排头归回第i个位置。
步骤5:i++。
步骤6:如果i<n,则转步骤2;否则结束。
package improve;
import java.util.Scanner;
public class Test2
{
public static void main(String[]args)
{
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int A[]=new int[n];
for(int i=0;i<n;i++)
{
A[i]=scanner.nextInt();
}
perm(A,0,n);
}
public static void perm(int A[],int k,int n)
{
if(k==n)
{
for(int i=0;i<n;i++)
System.out.print(A[i]+"-");
}
else {
for(int i=k;i<n;i++)
{
//实现A[i]与A[k]的交换
int temp=A[i];
A[i]=A[k];
A[k]=temp;
//递归
perm(A,k+1,n);
//实现A[i]与A[k]的交换
int temp2=A[i];
A[i]=A[k];
A[k]=temp2;
}
}
}
}
其中一种输入情况以及输出:
输入n=3
A[3]=[1,2,3]
输出为:1-2-3-1-3-2-2-1-3-2-3-1-3-2-1-3-1-2-
原来,自己分析不清循环中嵌套递归到底怎么理解,后来,通过下面的这个小例子对这个问题有了一定的理解。
package improve;
import java.util.Scanner;
public class Test3
{
public static void main(String[]args)
{
Scanner scanner=new Scanner(System.in);
int i=scanner.nextInt();
int n=scanner.nextInt();
digui(i,n);
}
public static void digui(int i,int n)
{
System.out.print("A");
for( i=i+1;i<n;i++)
{
System.out.print(i);
digui(i+1,n);
System.out.print("B");
}
}
}
测试:
输入:1 3
输出:A2AB
分析:开始调用digui方法时,i=1,n=3,执行输出A,进入循环,i=1+1=2;2<3成立,所以输出2,此时调用方法digui(i+1,n),i+1=3 n=3;再次输出A,再次进入for循环,i=i+1=4;4<3不成立,所以此时没有再进入循环体,结束递归,执行输出B。
如果把n改为4,结果将变得复杂很多。
以这样的理解方式去理解递归法求全排列应该会简单很多。