通过递归递增/递减n位二进制(算法)

时间:2016-09-26 04:34:36

标签: algorithm recursion permutation

我有一个家庭作业问题,我们应该提出一个递归算法来找到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

我知道并理解递归是如何工作的,但我只能做简单的(数字序列,阶乘,排列等),我不知道如何提出递归算法,可以有人请帮帮忙吗?

2 个答案:

答案 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);
    }
}