YYSWDD
V2EX  ›  问与答

[算法] 列出 5 个开关的所有开关情况?

  •  
  •   YYSWDD · Apr 28, 2019 · 4179 views
    This topic created in 2746 days ago, the information mentioned may be changed or developed.

    5 个开关相当于 5 个二进制位。

    列出 5 个二进制位的所有排列情况。

    类似:

    0,0,0,0,0 ;

    0,0,0,0,1 ;

    0,0,0,1,0 ;

    0,0,0,1,1 ;

    0,0,1,0,0 ;

    0,0,1,0,1 ;

    ······

    Supplement 1  ·  Apr 28, 2019
    发现一种方法,可以这么列。
    但是有个问题,最后一个全是 1 的情况没有打印出来。

    //列出所有情况
    var recursion = function (arr, num) {
    if (num < arr.length ) {
    arr[num] = 0;
    recursion (arr, num + 1);
    console.log(arr.toString());
    arr[num] = 1;
    recursion (arr, num + 1);
    }
    }
    Supplement 2  ·  Apr 30, 2019
    确实用 1 楼回复的方法是最好的。

    for i in range(2**5):
    print bin(i)

    用 2 的 n 次方次循环。但是这种方法,就体会不到,每个开关变换的情况。

    转换成二进制,可以考虑用别的方法替换。
    binux
    binux
    Apr 28, 2019❤️5
    1
    for i in range(2**5):
    print bin(i)
    YYSWDD
    YYSWDD
    OP
    Apr 28, 2019
    2
    @binux #1 用算法实现。循环,递归把这个列出来。。
    binux
    binux
    Apr 28, 2019❤️1
    3
    @YYSWDD #2 我不是用循环列出来了吗。
    noqwerty
    noqwerty
    Apr 28, 2019❤️1
    4
    @binux #1 补充个好看点的:
    for i in range(2**5):
    print("{:05b}".format(i))
    YYSWDD
    YYSWDD
    OP
    Apr 28, 2019
    5
    @binux #3 我用递归的方式呢。
    madao
    madao
    Apr 28, 2019
    6
    ([1,0]*5).combination(5).to_a.uniq
    🤤
    SorcererXW
    SorcererXW
    Apr 28, 2019❤️1
    7
    非得使用所谓“算法”的说法,就是把它看成一个 n+1 层的二叉树,先序遍历一遍就好了
    holmesabc
    holmesabc
    Apr 28, 2019❤️1
    8
    第 1 位为 (0, 1), 与 F(剩余的四位所有开关方式) 组合一下。

    递归一下
    YYSWDD
    YYSWDD
    OP
    Apr 28, 2019
    9
    @binux 考试题目,这么写,会不会被打?
    inhzus
    inhzus
    Apr 28, 2019 via Android
    10
    void printPermutation(int depth, string foo) {
    if (depth > 5)
    return;
    else if (depth > 0)
    cout << foo << endl;
    printPermutation(depth + 1, foo + "1");
    printPermutation(depth + 1, foo + "0");
    }

    手机上写的 将就看吧
    inhzus
    inhzus
    Apr 28, 2019 via Android
    11
    @inhzus 搞错了
    else if (depth == 5)
    cout << foo <<endl;
    dingyaguang117
    dingyaguang117
    Apr 28, 2019
    12
    估计这题目是希望用 DFS
    stevenshuang
    stevenshuang
    Apr 28, 2019 via iPhone
    13
    cnt = 0
    def aux(start, arr):
    if start == 5:
    global cnt
    cnt += 1
    print arr
    else:
    for i in range(2):
    arr[start]= i
    aux(start+1, arr)
    def main():
    arr=[0]*5
    for i in range(2):
    arr[0]=i
    aux(1, arr)

    main()
    print cnt
    maggch
    maggch
    Apr 28, 2019
    14
    这也算算法吗...
    behanga
    behanga
    Apr 28, 2019
    15
    11111 的全排列?
    minami
    minami
    Apr 28, 2019❤️1
    16
    next_permutation,搞定
    minami
    minami
    Apr 28, 2019
    17
    还可以 bitset
    ezksdo
    ezksdo
    Apr 28, 2019
    18
    module Main where
    import Numeric.Natural
    import Prelude hiding ( (^) )

    (^) :: [Int] -> Natural -> [[Int]]
    a ^ n = f a n [[]]
    where
    f _ 0 s = s
    f a n s = f a (n - 1) ((:) <$> a <*> s)

    main :: IO ()
    main = print ([0, 1] ^ 5)
    sosilver
    sosilver
    Apr 29, 2019 via Android
    19
    function s(str, n) {
    if (n == 0) return arr.push(str)
    s(str + "0", n - 1)
    s(str + "1", n - 1)
    }
    LxExExl
    LxExExl
    Apr 29, 2019 via iPhone
    20
    LC 有个 combination 系列 模板总结的非常好了
    Cbdy
    Cbdy
    Apr 29, 2019 via Android
    21
    11111B 种
    iceheart
    iceheart
    Apr 29, 2019 via Android
    22
    for (ini i = 0; i < 32; i++) {
    printf("%d,%d,%d,%d,%d\n",
    i / 16,
    (i/8)&1,
    (i/4)&1,
    (i/2)&1,
    i&1);
    }
    loading
    loading
    Apr 29, 2019 via Android❤️3
    23
    楼主希望的是获得直译型的价值 5 毛的代码,而 @binux 给出一个价值 5 亿的代码。
    F281M6Dh8DXpD1g2
    F281M6Dh8DXpD1g2
    Apr 29, 2019 via iPhone❤️3
    24
    楼上所有答案的作者都没有 @binux 对这个问题理解的深刻
    JmmBite
    JmmBite
    Apr 29, 2019
    25
    i=32;
    while(i--){
    console.log((i).toString(2));
    }
    Variazioni
    Variazioni
    Apr 29, 2019
    26
    @binux #1 qiandao.today 的作者?膜拜大神。。
    versionzhang
    versionzhang
    Apr 29, 2019 via Android
    27
    这个不是用高中排列组合的知识就搞定了么。 。2 的 n 次方,每个开关有两种情况,总共有 n 位
    versionzhang
    versionzhang
    Apr 29, 2019 via Android
    28
    @versionzhang 列出来的话就是从 0 到 2 的 n 次方-1 的二进制表示。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2921 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 12:59 · PVG 20:59 · LAX 04:59 · JFK 07:59
    ♥ Do have faith in what you're doing.