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

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

  •  
  •   YYSWDD · 140 天前 · 1938 次点击
    这是一个创建于 140 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  140 天前
    发现一种方法,可以这么列。
    但是有个问题,最后一个全是 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 条附言  ·  138 天前
    确实用 1 楼回复的方法是最好的。

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

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

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

    递归一下
        9
    YYSWDD   140 天前
    @binux 考试题目,这么写,会不会被打?
        10
    inhzus   140 天前 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");
    }

    手机上写的 将就看吧
        11
    inhzus   140 天前 via Android
    @inhzus 搞错了
    else if (depth == 5)
    cout << foo <<endl;
        12
    dingyaguang117   140 天前
    估计这题目是希望用 DFS
        13
    stevenshuang   140 天前 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
        14
    maggch   140 天前
    这也算算法吗...
        15
    behanga   140 天前
    11111 的全排列?
        16
    minami   140 天前   ♥ 1
    next_permutation,搞定
        17
    minami   140 天前
    还可以 bitset
        18
    ezksdo   140 天前
    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)
        19
    sosilver   140 天前 via Android
    function s(str, n) {
    if (n == 0) return arr.push(str)
    s(str + "0", n - 1)
    s(str + "1", n - 1)
    }
        20
    LxExExl   140 天前 via iPhone
    LC 有个 combination 系列 模板总结的非常好了
        21
    Cbdy   140 天前 via Android
    11111B 种
        22
    iceheart   140 天前 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);
    }
        23
    loading   140 天前 via Android   ♥ 3
    楼主希望的是获得直译型的价值 5 毛的代码,而 @binux 给出一个价值 5 亿的代码。
        24
    liprais   140 天前 via iPhone   ♥ 3
    楼上所有答案的作者都没有 @binux 对这个问题理解的深刻
        25
    JmmBite   140 天前
    i=32;
    while(i--){
    console.log((i).toString(2));
    }
        26
    Variazioni   140 天前
    @binux #1 qiandao.today 的作者?膜拜大神。。
        27
    versionzhang   139 天前 via Android
    这个不是用高中排列组合的知识就搞定了么。 。2 的 n 次方,每个开关有两种情况,总共有 n 位
        28
    versionzhang   139 天前 via Android
    @versionzhang 列出来的话就是从 0 到 2 的 n 次方-1 的二进制表示。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2530 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 00:47 · PVG 08:47 · LAX 17:47 · JFK 20:47
    ♥ Do have faith in what you're doing.