搜索 递归 具体运行流程

**

一般初学者在看搜索的时候,很可能被递归给扰乱,不知道每个数都是怎么变化的,怎么算出来的,以下就是最简单的题的所有计算流程,手算不易求支持

**

**

题目描述

**
排列与组合是常用的数学方法。
先给一个正整数 ( 1 < = n < = 10 )
例如n=3,所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输入
输入一个整数n( 1<=n<=10)

输出
输出所有全排列

每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格)

**

最简单的搜索入门题,AC代码如下,随后就是运行流程,方便理解怎么递归的

**

#include<iostream>

using namespace std;

int n;
int vis[10];
int a[10];

void dfs(int index){
	
	if(index == n){ //AAA
		for(int i = 0; i < n ;i++) cout << a[i];
		cout << endl;
		return;
	}
	
	else{ 
		for(int i =1; i <= n ;i++){ //BBB
			if(!vis[i]){        //CCC 判断 vis 是不是0 是0 下一步 
				vis[i] = 1;
				a[index] = i;
				dfs(index + 1);
				a[index] = 0;
				vis[i] = 0;
			}
		}
	}
} 

void init(){
	for(int i = 0; i<9 ;i++)
	vis[i] = 0;
}

int main(){
	
	while(cin >> n){
		dfs(0);
		init();
	}
	return 0;
}

以下为方法 vis ,递归的运行流程,把每一步的每一个数的结果,流程全部都写出来了。

具体运行如下
	(cin << 3;) 	//以输入n为3作例
	index = 0 != n  //对应AC代码注释的AAA
else for i = 1		//对应AC代码注释的BBB
	if == 0			//对应AC代码注释的CCC
	vis[1] = 1		//记下来是否用过的记录
	a[0] = 1		//记下来运算答案
	dfs(1)  >>> 	index = 1 		//开始递归
					for i = 1 		//对应AC代码注释的BBB
					if != 0			//对应AC代码注释的CCC
					for i = 2
					if == 0
					vis[2] =1
					a[1] =2
					dfs(2) >>>		index =2 
									for i = 1
									if != 0
									for i = 2
									if != 0
									for i = 3
									if == 0
									vis[3] =1
									a[2] =3
									dfs(3) >>> index = 3 = n	//对应AC代码注释的AAA
												cout << a{} //1 2 3
												return
									vis[3] =0
									a[2] =0		//去掉标记
					vis[2] =0
					a[1] =0
					for i = 3	  //对应AC代码注释的BBB
					if == 0		  //对应AC代码注释的CCC
					vis[3] =1
					a[1] =3
					dfs(2) >>>     index =2
								   for i = 1
								   if != 0
								   for i = 2
								   vis[2] =1
								   a[2] =2
								   dfs(3) >>> index = 3 = n
								   				cout << a{} //1 3 2
								   				return
								   vis[2] =0
								   a[2] =0
								   for i = 3
								   if != 0
					vis[3] =0
					a[1] =0
	for i = 2	 //对应AC代码注释的BBB
	if == 0		 //对应AC代码注释的CCC
	vis[2] =1
	a[0] =2
	(vis[i] = 1 , a[index] = i , dfs(index)) //把变量的运算再写过来,不用再看AC代码了
	dfs(1) >>> 		index = 1
					for i = 1 
					if == 0
					vis[1] =1
					a[1] =1
					dfs(2) >>>		index =2
									for i = 1
									if != 0
									for i = 2
									if != 0
									for i = 3
									vis[3] =1
									a[2] =3
									dfs(3) >>> index = 3 = n
												cout << a{} //2 1 3
												return
									vis[3] =0
									a[2] =0
					for i = 2
					if != 0
					for i = 3
					if == 0
					vis[3] =1
					a[1] =3
					dfs(2) >>>		index =2
									for i = 1
									if == 0
									vis[1] =1
									a[2] =1
									dfs(3) >>> index = 3 = n
												cout << a{} //2 3 1
												return
									vis[1] =0
									a[2] =0
									for i = 2
									if != 0
									for i = 3
									if != 0
					vis[3] =0
					a[1] =0		
	for i = 3
	if == 0
	vis[3] =1
	a[0] =3
	(vis[i] = 1 , a[index] = i , dfs(index))
	dfs(1) >>> 		index = 1
					for i = 1 
					if == 0
					vis[1] =1
					a[1] =1
					dfs(2) >>>		index =2
									for i = 1
									if != 0
									for i = 2
									if == 0
									vis[2] =1
									a[2] =2
									dfs(3) >>> index = 3 = n
												cout << a{} //3 1 2
												return
									vis[2] =0
									a[2] =0
									for i = 3
									if != 0
					for i = 2
					if == 0
					vis[2] =1
					a[1] =2
					dfs(2) >>>		index =2
									for i = 1
									if == 0
									vis[1] =1
									a[2] =1
									dfs(3) >>> index = 3 = n
												cout << a{} //3 2 1
												return
									vis[1] =0
									a[2] =0
									for i = 2
									if != 0
									for i = 3
									if != 0
					vis[3] =0
					a[1] =0	
					for i = 3
					if != 0
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值