[算法] 列出 5 个开关的所有开关情况? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
YYSWDD
V2EX    问与答

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

  •  
  •   YYSWDD 2019 年 4 月 28 日 3527 次点击
    这是一个创建于 2465 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 ;

    第 1 条附言    2019 年 4 月 28 日
    发现一种方法,可以这么列。
    但是有个问题,最后一个全是 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);
    }
    }
    第 2 条附言    2019 年 4 月 30 日
    确实用 1 楼回复的方法是最好的。

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

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

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

    递归一下
    YYSWDD
        9
    YYSWDD  
    OP
       2019 年 4 月 28 日
    @binux 考试题目,这么写,会不会被打?
    inhzus
        10
    inhzus  
       2019 年 4 月 28 日 via Android
    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
        11
    inhzus  
       2019 年 4 月 28 日 via Android
    @inhzus 搞错了
    else if (depth == 5)
    cout << foo <<endl;
    dingyaguang117
        12
    dingyaguang117  
       2019 年 4 月 28 日
    估计这题目是希望用 DFS
    stevenshuang
        13
    stevenshuang  
       2019 年 4 月 28 日 via iPhone
    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
        14
    maggch  
       2019 年 4 月 28 日
    这也算算法吗...
    behanga
        15
    behanga  
       2019 年 4 月 28 日
    11111 的全排列?
    minami
        16
    minami  
       2019 年 4 月 28 日   1
    next_permutation,搞定
    minami
        17
    minami  
       2019 年 4 月 28 日
    还可以 bitset
    ezksdo
        18
    ezksdo  
       2019 年 4 月 28 日
    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
        19
    sosilver  
       2019 年 4 月 29 日 via Android
    function s(str, n) {
    if (n == 0) return arr.push(str)
    s(str + "0", n - 1)
    s(str + "1", n - 1)
    }
    LxExExl
        20
    LxExExl  
       2019 年 4 月 29 日 via iPhone
    LC 有个 combination 系列 模板总结的非常好了
    Cbdy
        21
    Cbdy  
       2019 年 4 月 29 日 via Android
    11111B 种
    iceheart
        22
    iceheart  
       2019 年 4 月 29 日 via Android
    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
        23
    loading  
       2019 年 4 月 29 日 via Android   3
    楼主希望的是获得直译型的价值 5 毛的代码,而 @binux 给出一个价值 5 亿的代码。
    F281M6Dh8DXpD1g2
        24
    F281M6Dh8DXpD1g2  
       2019 年 4 月 29 日 via iPhone   3
    楼上所有答案的作者都没有 @binux 对这个问题理解的深刻
    JmmBite
        25
    JmmBite  
       2019 年 4 月 29 日
    i=32;
    while(i--){
    console.log((i).toString(2));
    }
    Variazioni
        26
    Variazioni  
       2019 年 4 月 29 日
    @binux #1 qiandao.today 的作者?膜拜大神。。
    versionzhang
        27
    versionzhang  
       209 年 4 月 29 日 via Android
    这个不是用高中排列组合的知识就搞定了么。 。2 的 n 次方,每个开关有两种情况,总共有 n 位
    versionzhang
        28
    versionzhang  
       2019 年 4 月 29 日 via Android
    @versionzhang 列出来的话就是从 0 到 2 的 n 次方-1 的二进制表示。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5456 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:29 PVG 16:29 LAX 00:29 JFK 03:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86