通过递归遍历n位2进制数的所有情况

本文介绍了如何使用递归方法遍历并打印一个m位二进制数的所有可能组合,从00...0到11...1,以换行符分隔。程序示例展示了当m等于3时的输出结果,并提及了对于固定m值的循环实现方式。

题目要求:

输入一个正整数m,输出m位2进制的所有取值情况,从小到大输出,每个输出结果用换行符分割。

解题思路:

通过递归调用,从第1个到第m个数组元素分别置0和置1,然后当从1到m所有的元素都置0或者置1之后,进行输出。

程序代码:

#include<iostream>
using namespace std;
int m = 0;
void fun(int *a,int n)
{
	if(n>=m)
	{
		for(int i=0;i<n;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
		return;
	}
	a[n] = 0;
	fun(a,n+1);
	a[n] = 1;
	fun(a,n+1);
}
int main()
{
	cin>>m;
	int * a = new int [m];
	fun(a,0);
	return 0;
}


当m=3的时候,输出结果为:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

程序运行的示例图:

如果,m不是一个由用户输入的值,而是一个固定的值,还可以使用m层循环来实现该程序:

#include<iostream>
using namespace std
### 使用递归实现十进制转二进制 递归是一种通过函数调用自身的编程技术,通常用于解决可以分解为较小子问题的问题。在将十进制数转换为二进制的过程中,可以通过不断地将整数除以2并记录余数的方式完成这一目标。以下是基于Python的递归实现方法及其代码示例。 #### 方法描述 为了实现十进制到二进制的转换,定义一个递归函数`convert_to_binary(n)`,其中参数`n`是一个非负整数。该函数的核心逻辑如下: 1. 如果`n`等于0,则停止递归(这是递归的终止条件)。 2. 否则,先递归调用`convert_to_binary(n // 2)`,这一步负责处理更高的部分。 3. 接着打印当前层计算所得的余数`n % 2`,即对应于当前上的二进制数值[^3]。 需要注意的是,在实际应用中,如果要返回完整的字符串形式而非逐输出,可以在递归过程中构建结果字符串而不是直接打印每一[^1]。 #### Python代码示例 下面提供了一种具体的实现方式: ```python def convert_to_binary(n): if n > 1: # 继续向下一层递归直到满足基线条件 convert_to_binary(n // 2) print(n % 2, end='') # 输出当前层次下的二进制 # 测试例子 number = 25 print(f"The binary representation of {number} is:") convert_to_binary(number) # 调用递归函数进行转换 ``` 上述程序会依次显示给定数字各置上相应的二进制值,并且由于采用了前序遍历的形式,所以能够自然地按照从高到底顺序排列起来形成最终答案[^2]。 另外一种变体版本允许收集所有的比特成单一字符串再一次性展示出来: ```python def recursive_decimal_to_binary(num): if num >= 2: return recursive_decimal_to_binary(num // 2) + str(num % 2) else: return '1' if num == 1 else '0' result = recursive_decimal_to_binary(87) print(result) # Output will be the string "1010111" ``` 此版本中的`recursive_decimal_to_binary()`不仅执行了必要的算术运算还累积形成了整个二进制串作为其返回值的一部分[^4]。 尽管递归解决方案看起来简单明了,但对于特别巨大的输入数据而言可能存在性能瓶颈或者甚至引发运行时错误——这是因为每增加一次新的嵌套调用都需要额外分配内存资源用来保存局部变量状态等信息;相比之下采用显式的循环结构往往能更好地控制这些开销从而适用于更大规模的数据集[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值