数据结构第一次作业

本文介绍了如何使用递归算法分别求解字符串的幂集和生成2的n次方的所有排列组合。对于幂集问题,通过递归方式顺序输出所有子集,而排列组合则展示了从0到1填充数组并递归输出所有可能组合的过程。代码中包含了详细的解释和示例。

数据结构第一次作业

P33-14

  1. 问题描述
    求幂集
  2. 测试结果
    我建议先看结果
    在这里插入图片描述
  3. 算法思想 递归
  4. 首先这个是根据这里进行的学习的
    https://blog.youkuaiyun.com/summer_dew/article/details/83921730?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162904254416780274173505%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162904254416780274173505&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-6-83921730.first_rank_v2_pc_rank_v29&utm_term=%E7%94%A8%E9%80%92%E5%BD%92%E6%B1%82%E5%B9%82%E9%9B%86&spm=1018.2226.3001.4187
    显然人家写的比我好。
    然而我也做了改进好不好。
    就是我这个是顺序的,他那个是逆序的。我这里先输出a,他那里先输出c
    5.贴一下我的代码
    也是借鉴了静态数组,第一个If条件就是终点的判断啦,以及一些格式控制。后面没到终点,就是递归白。注意不能颠倒顺序,为啥,你可以自己手动跑一遍,会发现\0的一些设置问题。
    总之你就先看那个人的代码吧,再来理解我的破代码。
#include <iostream>
using namespace std;
void helper(char* a, int n, int index)
{
	static char tmp[100];
	if (n >= strlen(a))
	{

		tmp[index] = '\0';
		cout << '(' << tmp << ')';

		if (strlen(tmp))
			cout << ',';

		return;
	}
	if (n < strlen(a))
	{
		//选a[n]
		tmp[index] = a[n];
		helper(a, n + 1, index + 1);

		//不选a[n]
		helper(a, n + 1, index);
		//顺序不能变,\0必须是最后

	}
}
int main()
{
	char temp[50] = "abc";
	cout << "{";
	helper(temp, 0, 0);
	cout << "}\n";
	system("pause");
	return 0;
}

P32-2

  1. 问题描述 输入2,输出ture,true;true,false;false,true;flase,flase;这2的n次方的所有可能的排列组合。同样输入n,也能输出2的n次方种组合;

  2. 测试结果我建议先看结果
    在这里插入图片描述
    在这里插入图片描述

  3. 算法思想 递归

  4. 以n=2举例,先创建了一个大小为2的数组,然后就给1or0,直到数组满了为止。显然第三行就是我们想要的结果。
    在这里插入图片描述
    5.我建议你直接照着代码手推一遍,这是理解这种简单递归题的最好方法。所以就直接上代码了。
    有几个点说一下,使用了流算子boolalpha,可以将bool类型直接输出英文,当然这也导致了我new的数组是Bool类型的,而不是int类型的。

#include <iostream>
#include<vector>
using namespace std;
void helper(bool *a, int index,int t)
{
	if (index == t)
	{
		for (int i = 0; i < t; i++)
		{
			cout << boolalpha << a[i];
			if (i != t - 1)  cout << ',';
		}
		cout << '\n';
		return;
	}
	a[index] = 0;
	helper(a, index + 1,t);

	a[index] = 1;
	helper(a, index + 1,t);
}
int main()
{
	int n;
	cout << "请输入n\n";
	cin >> n;
	bool* ptr = new bool[n];
	helper(ptr,0,n);
	delete[]ptr;
	system("pause");
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值