二进制数递归列举

问题1:给定一个正整数 n,列举出所有的位数为 n 的二进制数

  这里采用递归列举所有的数。

public class Satchel {
	// 自定义打印函数
	public static void printf(int[] arr) {
		int len = arr.length;
		int i = 0;
		for (; i < len-1; i++) {
			System.out.print(arr[i]);
		}
		System.out.println(arr[i]);
	}

	public static void binary(int[] arr, int len, int n) {
		if (n == len - 1) {
			printf(arr);
			arr[n] = 1;
			printf(arr);
			return ;
		}
		binary(arr, len, n+1);
		arr[n] = 1;
		binary(arr, len, n+1);
	}
}

 

问题2:给上述问题加一个约束,每次打印的数之间的汉明距离为1

  n = 2           n = 3                 n = 4

  00                 000                     0000

  01                 001                     0001

  11                 011                      0011

  10                 010                     0010

110                     0110

111                     0111

101                     0101

100                     0100

中心思想:绑定两个相邻的位为一组,判断是从 00 -> 01 -> 11 -> 10 还是 10 -> 11 -> 01 -> 00的顺序。如果 n 是偶数,当然很简单,如果是奇数,则分别令最高位为0/1,剩下的 n-1 位是偶数位。

	public static void binaryPlus(int n) {
		int[] arr = new int[n];
		if (n % 2 == 0) {        // 判断奇数或偶数
			binaryPro(arr, n, 0, 1);
		} else {
			binaryPro(arr, n, 1, 2);
			arr[0] = 1;
			binaryPro(arr, n, 1, 2);
		}
	}

	public static void binaryPro (int[] arr, int n, int left, int right) {

		if (left == n) {
			printf(arr);
			return ;
		}
		if (arr[left] == 0 && arr[right] == 0) {
			binaryPro(arr, n, left+2, right+2);
			arr[right] = 1;
			binaryPro(arr, n, left+2, right+2);
			arr[left] = 1;
			binaryPro(arr, n, left+2, right+2);
			arr[right] = 0;
			binaryPro(arr, n, left+2, right+2);
		} else if (arr[left] == 1 && arr[right] == 0) {
			binaryPro(arr, n, left+2, right+2);
			arr[right] = 1;
			binaryPro(arr, n, left+2, right+2);
			arr[left] = 0;
			binaryPro(arr, n, left+2, right+2);
			arr[right] = 0;
			binaryPro(arr, n, left+2, right+2);
		}

	}

  

时间: 2024-10-24 13:50:44

二进制数递归列举的相关文章

递归 ---- 列举1到n的所有排列

java 递归实现删除或查询指定目录下的全部文件

/** * 递归列举盘符下的全部文件的名称,如E:\HeartIsland * * @author HeartIsland * */ public class FileListDemo { /** * 递归列举盘符下的全部文件的名称.如E:\HeartIsland之下的全部文件 并吧路径打印出来 * * File file = new File("E:\\HeartIsland\\"); * // 列出文件的路径 * System.out.println(file.getPath())

数据结构基础 背包问题(一) 之 非递归解

[问题描述] "背包题目"的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,-,wn,希望从N件物品中选择若干物品,所选物品的重量之和恰能放进该背包,即所选物品的重量之和即是S.递归和非递归解法都能,试非递归算法求得"背包题目"的一组解 [算法分析] 1.此程序是得到问题的所有解: 2.本题只对背包有重量约束: 3.算法思想(暴力枚举) 1)初始化flag数组,数组长度为背包数目 n,数组为全 0 序列,0,1表示是否添加第 i

Shell的那些事儿

日常工作中,哪种语言对你的帮助最大?我觉得非Shell莫属.最早接触Shell应该是在大学的时候,如做Linux文件系统裁减会用到一些命令,如find, tar, xargs, cp等等,并把它们通过SHELL组合起来.但现实项目中最早接触到Shell脚本,其实是Windows的批处理脚本,BAT脚本被用于在EFI测试过程中的自动化测试.那真是一套庞大的脚本,也是对学生时代的一个冲击. 毕业后开始工作时,工作环境主要还是在Linux下面,不可避免地会用上各种命令,并尝试着用这些命令解决一些实际问

【python】找呀找呀找webshell

写了一个py脚本,用来找服务器被人留下的webshell. 之前是递归列举文件,现在用walk函数,快了些. 改动最大的就是正则了,看上去像样不少. ( '[_ ]{,1}[pP][aA][sS][sS][\w ]{,20}= {,3}[\'\"]{1,4}.{,33}', '[_ ]{,1}[pP][Ww][\w ]{,20}= {,3}[\'\"]{1,4}.{,33}', '[mM][mM] {,20}= {,3}[\'\"]{1,4}.{,33}', '[mM][iI

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

这篇文章主要介绍了WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍,WQL是指Windows管理规范查询语言,需要的朋友可以参考下 WQL就是WMI中的查询语言,WQL的全称是WMI Query Language,简称为WQL,翻译成中文好像可以成为Windows管理规范查询语言.熟悉SQL语言的朋友会感觉它和SQL非常相似. WQL其实非常简单,它有如下特点:1.每个WQL语句必须以SELECT开始:2.SELECT后跟你需要查询的属性名(我刚才对应SQL将其称之为字段名

Python8-24

pickle存取图片 #Open your images in binary mode and read them in as binary strings then #save them in a list/dict/tuple , then pickle it. >>> import Image, pickle, cStringIO >>> i = open('c:/1.jpg', 'rb') >>> i.seek(0) >>>

服务发现系统etcd之安装和使用

一.概述 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性.Raft是一个新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性.Google的容器集群管理系统Kubernetes.开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd.在分布式系统中,如何管理节点间

etcd集群入门

使用docker-compose搭建etcd集群环境 https://www.jianshu.com/p/44022c67f117 Docker 搭建 etcd 集群 API的使用:https://www.cnblogs.com/xishuai/p/docker-etcd.html ## 获取etcd的版本号 curl -L http://127.0.0.1:2379/version ## 设置一个key的value curl http://127.0.0.1:2379/v2/keys/mess