题目:
从1到n中选k个数进行排列

首先我们看这段代码:

#include <iostream>
using namespace std;
int n, k;
const int N = 1010;
int a[N];
bool st[N];void dfs(int u) {if (u == k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}}
}int main() {cin >> n >> k;dfs(1);return 0;
}

这段代码,把return去掉是不会有任何问题的,现在我们来看下面这段代码:

#include <iostream>
using namespace std;
int n, k;
const int N = 1010;
int a[N];
bool st[N];void dfs(int u) {if (u > k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}}
}int main() {cin >> n >> k;dfs(1);return 0;
}

这段代码如果我们把return去掉,就会出现结果不对的问题,原因是什么呢???
是终止条件的不同。

第一个代码的条件是u==k+1,而第二个代码的条件是u >k+1,那么当我们都把return 去掉时,第二个代码中的

for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}

此时继续dfs,那么u继续+1,举个例子,本来u=2,k = 1,u已经比k大了,输出一次结果,此时你不回溯,那么for循环继续,u+1,u = 3,u还是比k大,那么又会重新打印刚刚的结果,可是第一种情况,因为你的判断条件是u==k+1,u = 2,k = 1,符合条件,此时如果不回溯,u+1,u = 3,u!=k+1,就不会重新打印结果,所以最后答案是一样的,但是事实上dfs的次数变多了。

dfs中return回溯问题相关推荐

  1. DFS中的回溯法(纯暴力穷举)

    首先回溯法是深度搜索(DFS)的一种,即把所有可能穷举,根据条件筛选出符合条件的路径. 回溯法模板格式 dfs(...){//根据递归终止条件进行筛选 if(符合需要的条件){存储合理路径 retur ...

  2. 岛屿问题,矩阵:DFS+标记剪枝+回溯

    深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性.DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推. 剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成 ...

  3. 回溯算法:从电影蝴蝶效应中学习回溯算法的核心思想

    回溯算法:从电影<蝴蝶效应>中学习回溯算法的核心思想 数独.八皇后.0-1背包.图的着色.旅行商问题.全排列问题都能用到 理解"回溯算法" 回溯的思想,类似枚举搜索,枚 ...

  4. mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法

    本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. DELIMITER ...

  5. return true Java_[Java教程]js中return,return true,return false的用法及区别

    [Java教程]js中return,return true,return false的用法及区别 0 2015-11-16 23:00:03 1.语法及返回方式 ①返回控制与函数结果 语法为:retu ...

  6. C#中return语句的使用方法

    C#中return语句的使用方法 return语句终止它所在的方法的执行,并将控制权返回给调用方法,另外,它还可以返回一个可选值.如果方法为void类型,则可以省略return语句. return语句 ...

  7. python if写在return 后面_python中return如何写

    python中return的用法 1.return语句就是把执行结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return ...

  8. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  9. php return直接输出,PHP中return用法详细解读

    原标题:PHP中return用法详细解读 在大部分编程语言中,return关键字可以将函数的执行结果返回,PHP中return的用法也大同小异,对初学者来说,掌握PHP中return的用法也是学习PH ...

最新文章

  1. PHP远程下载图片损坏问题
  2. [YTU]_2445(C++习题 输入输出--公用继承)
  3. 服务器会自动创建cookie,网站的cookie机制是什么
  4. 你可能需要了解一下的中台
  5. Java笔试之Singleton
  6. [SHELL]监控LINUX目录文件变化
  7. SPH(光滑粒子流体动力学)流体模拟实现:算法总览
  8. groovy和java结合使用
  9. node中的异步API
  10. M1卡说明及使用proxmark3破解方法
  11. 蓝桥杯 ADV-104算法提高 打水问题
  12. wifi已连接不可上网服务器无响应,wifi已连接不可上网是什么原因?
  13. matlab矩阵特征值分解,矩阵特征值分解与奇异值分解含义解析及应用
  14. 为什么有些公司不招大龄程序员?
  15. 【Java】Response约定
  16. android中的高级组件(三)(ExpandableListView,ImageSwitcher,Gallery)
  17. 蓝牙技术|防丢背包获奖,Find My产品受追捧
  18. Java Selenium3 WebDriver启动火狐、Chrome、IE,Edge浏览器的方法(一)
  19. (WPF)连锁超市收银系统总结
  20. JAVA 如何使用File类创建文件,文件夹

热门文章

  1. 从C#开始的面向对象编程经典自学教程
  2. C#帮助控件HelpProvider的使用
  3. C和指针之字符串编程练习1
  4. C++之operator关键字(重载操作符) 使用总结
  5. C++之类模板最简单的使用
  6. Tree的前序序列化
  7. Android之ViewPager使用(用美女做的背景,给你疲惫的眼睛视觉冲击)
  8. python函数返回多个值时的数据类型是_Python3 注释多个返回值的函数类型
  9. 实验 6 场景创建与执行 实验报告--软件功能测试与性能测试实验
  10. 用魔法打开科学,孩子惊叫连连,想不爱科学都难!