我有一个家庭作业问题,我们应该提出一个递归算法来找到n位二进制数的七个排列,从0开始(例如,如果n = 4,那么起始数字是0000 )。规则是提出数字中可能的最小变化,一次只改变1位,可能得到最小的十进制结果。
根据规则,第一个排列将是0001(小数点为1),第二个排列为0011(小数点为3),第三个为0010,依此类推。
我在问题中给出的排列是这些:
1. 0000 = 0
2. 0001 = 1
3. 0011 = 3
4. 0010 = 2
5. 0110 = 6
6. 0100 = 4
7. 0101 = 5
我知道并理解递归是如何工作的,但我只能做简单的(数字序列,阶乘,排列等),我不知道如何提出递归算法,可以有人请帮帮忙吗?
答案 0 :(得分:0)
您可以尝试这种方式 - >
void rec(string s)
{
mapped[s]=true; /// Mapping the string, which will stop repetition
cout<<s<<endl; /// Printing s
for(int i=0; i<4; i++){ /// looping through s
if(!mapped[toggle(s,i)]){ /// checking if toggled string is mapped
rec(toggle(s,i)); /// Calling the toggled string
}
}
}
此处s=0000
&amp; toggle
会切换字符串i-th
的{{1}}位。以下是您的s
功能 - &gt;
toggle
代码块输出 - >&gt;
string toggle(string s, int pos){
if(s[pos]=='1')s[pos]='0';
else s[pos]='1';
return s;
}
您可以随意停止打印!!
答案 1 :(得分:0)
如果你只想要7个最小的二进制字符串,就像你一直只有0
- 110
那样,我不完全确定“最小十进制结果可能”是什么意思某些原因您不想使用C++
mapping
:
public class f {
static int count = 0;
static int n = 7;// n smallest binary strings
/**
*
* @param str initialize with ""
* @param len number of bits
*/
static void g(String str,int len){
if(count<n) {
if (len == 0) {
count++;
System.out.println(str);
} else {
g(str + "0", len - 1);
g(str + "1", len - 1);
}
}
}
public static void main(String[] args) {
g("",4);
}
}