全排列算法(递归实现框架)Java


public class fullPermutation {
	static int count =0;
	public static void main(String args[]){
		int[] arr = {1,2,3};
		f(arr,0);
		System.out.print(count);
	}
	
	public static void f(int arr[], int k){//k为已确定的第几位数,从第一位到最后一位,一位一位的确定下来
		if(k == arr.length-1){//递归出口,最后一位也确定了,就是一种可能性,可做输出、count++等操作。
			print(arr);
			count++;
		}
		
		for(int i=k; i<arr.length ; i++){//i从第k位开始
			int tmp = arr[i];//交换第i位与第k位
			arr[i] = arr[k];
			arr[k] = tmp;
			
			f(arr,k+1);//通过以上交换,第k位已确定,然后对第k+1位的重复以上操作。
			
			tmp = arr[k];//要把第i位与第k位换回来,恢复成原样,然进行下一次循环,拿第k位继续与第i+1位交换。
			arr[k] = arr[i];
			arr[i] = tmp;
		}
		
	}
	
	public static void print(int[] arr){//输出
		for(int i=0; i<arr.length; i++){
			System.out.print(arr[i]);
		}
		System.out.println();
	}
}

输出结果:

123
132
213
231
321
312
6 //3!,数组size的阶层

从输入结果可见,该递归首要的就是从第一位开始,一位一位的确定下来(用k计数),当k到达最后一位时,视作一种可能性,随后回溯到上一层for循环,继续进行交换操作,例如输出结果中,当第一种结果“123”输出后,回溯到当k=1的for循环中,恢复原样后i++,即当k=1,arr[k]=2,i++后i=2,arr[i]=3,再讲arr[i]与arr[k]交换,视作另一种可能性,随后输出“132”,随后再次回溯到当k=1的for循环中,i++后i=3,退出for循环,回溯到k=0的for循环中,再重复以上操作,直至k=0的for循环结束。

你可能感兴趣的:(算法题)