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

实验一 递归练习

一、实验目的

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} 。正好是上述两个的并集


对递归的看法:

递归难理解,我曾经妄想将所有的递归弄明白,搞透彻,后来只是将自己弄的心情郁闷。现在想想还是顺其自然,能想出来就算运气好,想不出来也不要强求。很多时候做数学题都会赞叹这解题方法是谁想出来的?普通人怎么能这样想到的呢?明显就是凑出来的啊!哈哈,不让自己钻牛角尖,保持快乐也不错啊!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值