深度优先搜索DFS;递归

洛谷P1036 选数

首先想一下想要实现什么功能,我们想让它一直找数加,如果加够k个了,那么就 return 。所以得有一个数记录加了几个,但是在递归函数里呢,他不知道自己进行到哪一步,所以说就应该形参里放入这个步数 step,执行函数时首先判断是否加够k个了。

对于递归或者说深度优先搜索来说子函数里都有for循环,这样他们才能一层一层的嵌套。for循环一般分为两种,第一种是。循环的起点与形参有关。另一种这种循环与形参无关。  具体题目要分析该用哪个循环。对于此题,很明显要用第一种。

 回溯是递归中很重要的一个部分。因为递归最根本的本质就是   递---归    ,先往下/里“递”  递到底, 再“归”回来。从开始先一条路走到底,然后慢慢往回退,所以如果对于全局变量的值,我们在走到底回来的过程中,需要将之前算的值进行清空,回到递归之前的值。如  在结束后,说明这条路我们已经走完了,已经回来了, 我们想尝试其他的办法,但这时num肯定发生了变化,我们想尝试其他的情况,必然要对num进行回溯。   回溯有一种替代方式: 将想要回溯的值放入形参中,这样在一个函数里,这个值在  递--归  回来之后,依然不变。也就没必要回溯了。

递归里找到终止条件是非常重要,这决定了什么时候结束“递”,开始“‘归’”

同时,对于判断语句,要考虑其出现的位置,自己把过程过一遍就大概知道要放在哪了。

洛谷P1706 全排列问题

 本题目难度较大。

这个题与上个题最大的区别是循环用的是从1开始的。并且这道题用到了标记数组。从题目中可开出,数字一够三个就输出,所以肯定要记录步数,步数一到就输出。一开始我没想用输出数组的方法,并且想用这种循环,一个一个数字输出。因为输出是123···所以这样想是很自然地。可是有一个问题,123输出完后,递完了,该归了,要回到2的一层,是不可能输出1的啊,所以必须要用数组存数。并且还要有一个标记数组,标记这个数字被用了没有。核心代码见上图。

洛谷P1157 组合的输出

 

 这道题和上两道题很像,输出判断同样要用步数,步数放在形参里。  上面中间的图,实现了输出以1开头的。为了继续输出其他开头的,在main函数里用了一个for循环。

洛谷P1028 数的计算

这就是最简单的深度优先搜索。到1 为止。6→1 2 3 →1 :1  2:1    3:1   用递归写出来就是上边这个。

猜你喜欢

转载自www.cnblogs.com/lau1997/p/12431311.html