初学dfs时候一直不明白函数里要return干什么…后来看了看大佬们的讨论和文章有了点简单的理解。
例题
输入一个n,输出n的全排列,n<=9
先看第一个代码
#include <bits/stdc++.h>
using namespace std ;
const int N = 10 ;
int num[N] ;
int value[N] ;
int n ;
void dfs(int k){
if (k == n + 1){
for (int i = 1 ; i <= n ; i ++)
cout << num[i] << " " ;
cout << endl ;
//return;
}
for (int i = 1 ; i <= n ; i ++ ){
if (!value[i]){
num[k] = i ;
value[i] = 1 ;
dfs(k + 1) ;
value[i] = 0 ;
}
}
}
int main(){
cin >> n ;
dfs (1) ;
return 0 ;
}
这里if(k == n + 1)后面加不加return都可以
看另一个代码
#include <bits/stdc++.h>
using namespace std ;
const int N = 10 ;
int num[N] ;
int value[N] ;
int n ;
void dfs(int k){
if (k > n){
for (int i = 1 ; i <= n ; i ++)
cout << num[i] << " " ;
cout << endl ;
return;
}
for (int i = 1 ; i <= n ; i ++ ){
if (!value[i]){
num[k] = i ;
value[i] = 1 ;
dfs(k + 1) ;
value[i] = 0 ;
}
}
}
int main(){
cin >> n ;
dfs (1) ;
return 0 ;
}
这里if(k > n) 要加上return了,第二个中k > n,k是n + 1,k是n + 2,k是n+n都符合,程序会一直执行
也就是又会重新打印刚刚的结果。但是第一种情况k == n ,k 就到 n 停止了,不会重新打印结果。所以最后答案是一样的,但是事实上dfs的次数变多了。