利用递归回溯法求全排列

要求排列出1到9数字组成的全排列,这里利用的是for循环的回溯法。

public static void main(String args[]){
		int a[] = new int []{1,2,3,4,5,6,7,8,9};
		f(a,0);//从第0位开始排到第8位
		
	} 
	public static  void f(int a[],int k){
		if(k == 9){
			 printf(a,data) ;//如果为9即确定到了第九位就说明已经排完了一趟,此时可以调用函数进行打印
		}
		else{
			for( int i = k;i<a.length;i++){//利用循环将a[i]和a[k]的值互换,即在剩余的数字中选择一个数字进行填入i,循环则是对剩余数字的遍历相当于每个数字都被挑选过了
				int temp = a[k];
				a[k] = a[i];
				a[i] = temp;
				
				f(a,k+1,data);//运行到这里就说明上一位已经挑选好,此时应该进行第i+1了
				
				temp = a[k];//运行到这那肯定就是上一语句已经运行完,对于此处的f函数运行完就只有一种情况:k==9,已经到头所以要回头继续遍历另一种情况,此时要恢复原来a[i]和a[k]的值没有互换的情况
				a[k] = a[i];
				a[i] = temp;
			}
		}
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯是一种经典的算思想,通常用于解决搜索问题、组合问题、排列组合问题等。其基本思想是从某一点开始,按照一定的规则向前搜索,若搜到某一步无解,则回退到上一步继续搜索,直到找到问题的解。 回溯的基本框架如下: ```python def backtrack(路径, 选择列表): if 满足结束条件: 记录结果 return for 选择 in 选择列表: 做出选择 backtrack(路径, 选择列表) 撤销选择 ``` 其中,路径表示当前搜索路径,选择列表表示当前可选的选择列表。接下来,我们以求解全排列问题为例,具体介绍一下回溯的实现过程。 全排列问题:给定一个数字列表,求出其所有可能的排列。 具体代码实现如下: ```python def permute(nums): res = [] def backtrack(path, choices): if not choices: res.append(path) for i in range(len(choices)): backtrack(path+[choices[i]], choices[:i]+choices[i+1:]) backtrack([], nums) return res ``` 其中,path表示当前搜索路径,choices表示当前可选的选择列表(即未被选择过的数字列表),如果当前选择列表为空,说明已经搜索到底部(即满足结束条件),将当前路径记录到结果中。否则,从选择列表中选择一个数字,将其加入到当前路径中,然后继续归搜索,最后将选择撤销,回溯到上一步。 使用方如下: ```python nums = [1, 2, 3] res = permute(nums) print(res) ``` 输出结果为: ``` [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] ``` 以上就是回溯的基本实现方,可以根据具体问题的特点进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值