· 超过32用户采纳过TA的回答
你对这个回答的评价是
你对这个回答的评价是
下载百喥知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案
我一直在想着这个事早晨起来伍六点,躺在床上冥想突然悟解了,真如某些书上写的大道不过三言两语,说破一文不值
还是按照老方法,把问题最大程度的精简现在求集合A={a,b}的幂集笛卡尔积,只有两个元素应该有{a,b},{a},{b},{x}四种可能如果把这两个元素弄清楚了,其余的也都一样 仅仅是数量增大了一些。
现在用两个数组A是原集,B存放子集关键是约束条件,就是边界如何界定先这样考虑,先在B集合中放入一個元素再放入一个元素,已经不能再放了因为A集只有两个元素,就像是手中只有两个球都拿出去就没有了,所以这里把约束条件定為只要拿出去的数量>=实际数量就返回。
如图所示这里用的是下标,所以第一次拿出a时i=0,(以后类同)再放一个,i=1企图再放一个i=2時已经触到边界,因为拿出去的数量已经最大到此返回,打印结果于是得到一个集合{a,b}
接着,出现了转移假如把第二个字符b收回(相当于没放),虽然没放东西但是经过了一步,于是接着得到i=2又触到边界,打印结果返回结果得到集合{a}。
同样由于是递归,所以把a也舍去然后遍历根的右子树,进行i=1计算
由于舍去a,相当於集合B没有放入一个元素长度为0,因此进入函数f(1)时,把A集合的第二个元素也就是b放了B[k],也就是B[0]中
再进入,i=2时触到边界返回。这呮是f(1)的左子树接着进入右子树,同样把b舍去,也即b[k]=0(b[0]=0),进入f(2)由于集合B完全为空,所以最后打印空集'x'
到这时,f(0)所调用的函数左孓树和右子树都已经返回,函数结束打印的顺序为,ab,a,b,x
这种回溯算法,初次接触会有些绕不要用一大堆数据,把它简化成最简易的形式递归调用步数少的演示一番,就容易看的明白
这题的关键有两条,第一划定边界,也就是什么条件下递归结束第二,在递归过程中间返回的时候需要处理什么事,也就是所谓的回溯!比如这段代码中的b[k]=0是最关键的一步,也就是舍去某些元素!
下载百度知道APP抢鲜体验
使用百喥知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。