V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
YYSWDD
V2EX  ›  问与答

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

  •  
  •   YYSWDD · 2019-04-28 11:17:10 +08:00 · 2919 次点击
    这是一个创建于 2027 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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-04-28 16:48:28 +08:00
    发现一种方法,可以这么列。
    但是有个问题,最后一个全是 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-04-30 08:55:56 +08:00
    确实用 1 楼回复的方法是最好的。

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

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

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

    递归一下
    YYSWDD
        9
    YYSWDD  
    OP
       2019-04-28 12:09:16 +08:00
    @binux 考试题目,这么写,会不会被打?
    inhzus
        10
    inhzus  
       2019-04-28 12:14:55 +08:00 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-04-28 12:18:07 +08:00 via Android
    @inhzus 搞错了
    else if (depth == 5)
    cout << foo <<endl;
    dingyaguang117
        12
    dingyaguang117  
       2019-04-28 12:19:13 +08:00
    估计这题目是希望用 DFS
    stevenshuang
        13
    stevenshuang  
       2019-04-28 12:19:29 +08:00 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-04-28 12:21:02 +08:00
    这也算算法吗...
    behanga
        15
    behanga  
       2019-04-28 17:54:58 +08:00
    11111 的全排列?
    minami
        16
    minami  
       2019-04-28 19:42:54 +08:00   ❤️ 1
    next_permutation,搞定
    minami
        17
    minami  
       2019-04-28 19:44:25 +08:00
    还可以 bitset
    ezksdo
        18
    ezksdo  
       2019-04-28 23:03:17 +08:00
    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-04-29 00:48:29 +08:00 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-04-29 01:16:51 +08:00 via iPhone
    LC 有个 combination 系列 模板总结的非常好了
    Cbdy
        21
    Cbdy  
       2019-04-29 05:39:26 +08:00 via Android
    11111B 种
    iceheart
        22
    iceheart  
       2019-04-29 06:20:45 +08:00 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-04-29 07:04:09 +08:00 via Android   ❤️ 3
    楼主希望的是获得直译型的价值 5 毛的代码,而 @binux 给出一个价值 5 亿的代码。
    liprais
        24
    liprais  
       2019-04-29 07:15:46 +08:00 via iPhone   ❤️ 3
    楼上所有答案的作者都没有 @binux 对这个问题理解的深刻
    JmmBite
        25
    JmmBite  
       2019-04-29 08:01:17 +08:00
    i=32;
    while(i--){
    console.log((i).toString(2));
    }
    Variazioni
        26
    Variazioni  
       2019-04-29 08:03:11 +08:00
    @binux #1 qiandao.today 的作者?膜拜大神。。
    versionzhang
        27
    versionzhang  
       2019-04-29 08:51:50 +08:00 via Android
    这个不是用高中排列组合的知识就搞定了么。 。2 的 n 次方,每个开关有两种情况,总共有 n 位
    versionzhang
        28
    versionzhang  
       2019-04-29 09:01:10 +08:00 via Android
    @versionzhang 列出来的话就是从 0 到 2 的 n 次方-1 的二进制表示。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4245 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.