递归过程中如何处理字符数组的输出——采用buffer数组

递归过程中如何处理字符数组的输出

有些递归函数要求求返回值,而有些递归函数则要求输出题目要求的字符数组。

全排列问题:

#include <iostream>
#include <cstring>
using namespace std;
char buffer[6];
int b = 0;

void FullSeq(int SeqLength,char s[])
{
	if(SeqLength == 0) 
	{
		cout << buffer << endl;
		
		return ;
	}
	
	for(int i=0;s[i];++i)
	{
		if(s[i] == '1') continue;
		
		buffer[b++] = s[i];
		
		char tmp = s[i];
		s[i] = '1'; //标记已输出的字符 ,不能用-1标记,-1是两个字符 
		
		FullSeq(SeqLength-1,s);
		 
		s[i] = tmp;//在以s[i]开头的全排列输出后还原已输出的字符 
		b--;
	} 
}
int main()
{
	char s[6];
	cin >> s;
	
	FullSeq(strlen(s),s);
	return 0;
}

对于一个输入的字符串,输出的字符串有多种可能,因此不能使用

输出一个字符
递归调用函数(SeqLength-1,s);

这样的话,对于长度为SeqLength的输入,只有一个输出。
本程序中采用了buffer数组记录每一步递归时累积产生的字符串,方便输出所有可能。

2的幂次方表示:

#include <iostream>

using namespace std;

void BinaryExp(int n)//n为正整数
{
	int result[20]; //设输入数据为1的位数最大20个 
	int Length=0; //记录当前位数 
	int j=0; //记录result数组有效长度 
	
	while(n != 0)
	{
		if(n % 2 == 1) result[j++] = Length;
		n/=2;
		Length++;
	}
	
	for(int i=j-1;i>=0;--i)
	{
		if(result[i] >= 2)
		{
			cout <<"2(";
			BinaryExp(result[i]);
			cout << ")";
		}
		else if(result[i] == 1) cout << "2";
		else if(result[i] == 0) cout << "2(0)";
		
		if(i > 0) cout << "+" ;
	}
}
int main()
{
	int n;
	cin >> n;
	BinaryExp(n);
	return 0;
}

对于某个输入n,程序只会对应输出一个结果,所以不需要:使用buffer数组

总结:当递归程序需要输出某个字符串,且一个递归函数对应多个输出字符串时,采用buffer数组记录递归时产生的每一步输出

这个问题可以通过使用多线程和信号量来实现。下面是一种可能的解决方案: ```python import threading import time # 创建一个共享的 buffer 数组 buffer = [0] * 10 # 创建两个信号量 lock1 = threading.Lock() # 用于 task1 访问 buffer 数组时的互斥 lock2 = threading.Lock() # 用于 task2 访问 buffer 数组时的互斥 # 创建一个变量,用于保存 task1 采集的数据 data = [0] * 10 # 定义 task1 函数,用于采集数据 def task1(): global buffer, data while True: # 采集数据 for i in range(10): data[i] = i + 1 # 获取 lock1 信号量 lock1.acquire() # 将采集到的数据保存到 buffer 数组 for i in range(10): buffer[i] = data[i] print("task1: buffer =", buffer) # 释放 lock1 信号量 lock1.release() # 休眠 1 秒钟 time.sleep(1) # 定义 task2 函数,用于处理数据 def task2(): global buffer while True: # 获取 lock2 信号量 lock2.acquire() # 计算 buffer 数组的数据之和 total = sum(buffer) print("task2: total =", total) # 释放 lock2 信号量 lock2.release() # 休眠 1 秒钟 time.sleep(1) # 创建两个线程分别执行 task1 和 task2 函数 t1 = threading.Thread(target=task1) t2 = threading.Thread(target=task2) # 启动两个线程 t1.start() t2.start() # 等待两个线程结束 t1.join() t2.join() ``` 在这个代码,我们创建了两个信号量 lock1 和 lock2 来控制 buffer 数组的访问。在 task1 函数,我们首先采集数据,并将采集到的数据保存到 data 数组。然后获取 lock1 信号量,将 data 数组的数据复制到 buffer 数组,并释放 lock1 信号量。在 task2 函数,我们获取 lock2 信号量,计算 buffer 数组的数据之和,并释放 lock2 信号量。 由于 lock1 和 lock2 信号量的存在,每次只有一个线程能够访问 buffer 数组,从而保证了数据的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值