我一直在想着这个事,早晨起来五六点,躺在床上冥想。突然悟解了,真如某些书上写的,大道不过三言两语,说破一文不值。
还是按照老方法,把问题最大程度的精简,现在求集合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}。
这就类似于树的先序遍历,如果是先序遍历的思路,剩下的就容易理解,因为先序的返回顺序是简易的,现在i=1的情况已经穷尽,也就是左右子树都已经返回,下一步就转移到根结点,也就是i=0时的情况。

同样,由于是递归,所以把a也舍去,然后遍历根的右子树,进行i=1计算。

void f(int i,char A[],int n)
{
char x;
int k;
if(i>=n)
{
if(B[])
cout<<'{'<<B<<'}'<<endl;
else
cout<<'x'<<endl;
}
else
{
x=A[i];
k=strlen(B);
B[k]=x;
f(i+,A,);
B[k]=;
f(i+,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,是最关键的一步,也就是舍去某些元素!

11.字符串{a,b}的幂集[回溯递归]的更多相关文章

  1. 2553 ACM N皇后 回溯递归

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553 中文题目,题意很简单. 思路:听说这是学习递归的经典题目,就来试试,发现自己一点想法都没有,一遇到递 ...

  2. #C++初学记录(N皇后#回溯递归)

    <font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...

  3. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

  4. 深悉正则(pcre)最大回溯/递归限制

    对于如下的正则 /<script>.*?<\/script>/is 当要匹配的字符串长度大于100014的时候, 就不会得出正确结果: $reg = "/<sc ...

  5. hihocoder 1680 hiho字符串2 dp求方案数+递归

    我们定义第一代hiho字符串是"hiho". 第N代hiho字符串是由第N-1代hiho字符串变化得到,规则是: h -> hio i -> hi o -> ho ...

  6. Pandas | 11 字符串函数

    在本章中,我们将使用基本系列/索引来讨论字符串操作.在随后的章节中,将学习如何将这些字符串函数应用于数据帧(DataFrame). Pandas提供了一组字符串函数,可以方便地对字符串数据进行操作. ...

  7. Chinese Mahjong UVA - 11210 (暴力+回溯递归)

    思路:得到输入得到mj[]的各个牌的数量,还差最后一张牌.直接暴力枚举34张牌就可以了. 当假设得到最后一张牌,则得到了的牌看看是不是可以胡,如果可以胡的话,就假设正确.否者假设下一张牌. 关键还是如 ...

  8. 单词拼接(dfs/回溯/递归)

    单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...

  9. c++ 11字符串与string转换常用函数

    这里主要介绍一下string to int 其他方法与这个类似,可到头文件 <string> 中查看 @_Str 转换的字符串 @_Idx 转换的长度(位数) @_Base 进制 doub ...

随机推荐

  1. ncodeURIComponent() 函数 vue内容

    ncodeURIComponent() 函数 编辑 encodeURIComponent() 函数[1]  作用:可把字符串作为URI 组件进行编码.其返回值URIstring 的副本,其中的某些字符 ...

  2. clamav杀毒软件的安装

    Linux Unix.Trojan.Elknot (Linux.BackDoor.Gates.5)木马清理 此恶意软件结合了传统后门程序和DDoS攻击木马的功能 前两天性能测试服务器被种马,cpu一直 ...

  3. Jquery和Ajax

    jQuery 是一个 JavaScript 函数库.JavaScript 是 HTML5 以及所有现代浏览器中的默认脚本语言! jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 ...

  4. Kotlin语言学习笔记(6)

    运算符重载(Operator overloading) 一元运算符 Expression Translated to +a a.unaryPlus() -a a.unaryMinus() !a a.n ...

  5. 原生nodejs 学习笔记2

    本章节学习流, 流的一个好处在于减少各种异步IO的回调地狱.IO操作遍及我们各种操作,比如数据库读写,文件读写, 文件转换压缩--别的不说,比如第一节,我们要将一个HTML文件返回浏览器,就涉及IO操 ...

  6. linux sleep用法

    应用程序:#include <syswait.h>usleep(n) //n微秒Sleep(n)//n毫秒sleep(n)//n秒驱动程序:#include <linux/delay ...

  7. console.log等不能打印全部数据/信息

    有时候console.log在chrome调试控制台打印不全,如下: 这个时候,我们可以点击进去:用watch 工具,添加变量,右击copy value 选项:

  8. Java8 Stream语法详解 2

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

  9. 安装和使用iOS的包管理工具CocoaPods

    CocoaPods是ruby实现的,需要用ruby进行安装,mac自带ruby,如果没有ruby的需要先安装ruby.   安装CocoaPods命令 安装CocoaPods命令:sudo gem i ...

  10. C# .net MD5加密函数

    using System.Web.Security; string password =FormsAuthentication.HashPasswordForStoringInConfigFile(t ...