您的位置:首页 > 理论基础 > 数据结构算法

回顾大学--大二数据结构实验--实验一 递归练习

2012-02-04 10:23 260 查看

实验一 递归练习

一、实验目的

1、熟悉开发工具的使用。

2、掌握递归的实现思想。

二、实验内容

1、输出n个整数的全排列。

2、输出n个整数的所有子集。

首先是安装开发工具:

Visual C++ 6.0(根据自己喜好)

百度搜索下载,我搜到的链接有:

下载地址1:Visual C++ 6.0 简体中文企业版集成SP6完美版

下载地址2:Visual C++ 6.0 简体中文企业版集成SP6完美版

——————————————————————————————————————————————————————————————————

下面是我的代码: 点此下载n个整数的全排列

——————————————————————————————————————————————————————————————————

一,输出n个整数的全排列。

下面是主要方法:

template<class T>
void Perm(T list[],int k,int m)
{
int i;
if(k==m)
{
for(i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else for(i=k;i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}


这个方法叫排列方法perm:输出list的第k到m个元素的全排列
举例解释:

list为:abcd(元素为第0到第3,即a是第0个元素,b是第1个元素)

那么排列第1到第3(即bcd),perm后结果为:

abcd
abdc
acbd
acdb
adbc
adcb


可以看出第0个元素a不变,第1到第3(即bcd)进行全排列,但是输出时也输出a。

如果perm方法理解后整个程序就差不多了。

下面就是递归思想:

1,如果需要排序的只有一个,如上述的abcd中需要排序的仅是最后的d,那么直接输出,即输出abcd。

2,否则,输出所有可能的第0个元素和后面的所有元素全排列,如上述的abcd,全排列为

第0个元素为a, 然后将bcd全排列
第0个元素为b, 然后将acd全排列
第0个元素为c, 然后将bad全排列
第0个元素为d, 然后将bca全排列


——————————————————————————————————————————————————————————————————

下面是我的代码: 点此下载n个整数的所有子集

——————————————————————————————————————————————————————————————————

主要的递归的方法如下:

void   Set(char   *s,int   len,int   bit) //递归主方法
{
if(bit==len)
{
show(s);
}
else
{
char c=*(s+bit);
*(s+bit)= '\0 ';	//去掉第bit个元素
Set(s,len,bit+1);
*(s+bit)=c;		//再加上第bit个元素
Set(s,len,bit+1);
}

}


首先明确Set方法:输出s中第bit到第len-1个元素的子集,(这里跟上一个一样,都是给出一个起始位置,最后都到最后一个元素就行了)

举例解释:

s为abc(元素为第0到第2,即a是第0个元素,b是第1个元素), 输出第1到第2个元素(即bc)的子集:

输出结果为:

{} {b} {c} {bc}


下面是递归思想:

1,如果bit超过最后一个元素len-1,即bit==len了,那么输出空集

2,否则,想办法用n-1个元素的子集,来表示n个元素的子集。通过观察可以得到下面的递归关系:

n个元素子集为:每个n-1个元素子集加上第一个元素,再加上n-1个元素子集。
例如{abc}去掉第一个元素a为{bc},其子集为:{ } { b}{ c}{ bc}
子集加上第一个元素a为:{a} {ab}{ac}{abc}
这四个就是{abc}比{bc}多出来的子集
{abc}的子集为:{} {b} {c} {bc} ,{a} {ac} {ab} {abc} 。正好是上述两个的并集


对递归的看法:

递归难理解,我曾经妄想将所有的递归弄明白,搞透彻,后来只是将自己弄的心情郁闷。现在想想还是顺其自然,能想出来就算运气好,想不出来也不要强求。很多时候做数学题都会赞叹这解题方法是谁想出来的?普通人怎么能这样想到的呢?明显就是凑出来的啊!哈哈,不让自己钻牛角尖,保持快乐也不错啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: