【问题标题】:Algorithm to create a binary-like pattern创建类似二进制模式的算法
【发布时间】:2019-10-11 07:43:28
【问题描述】:

我有两个号码:nsp。我想用sp 元素创建一个列表元素的模式,这些元素像二进制数字一样旋转到n。为了详细说明第二部分,这里举个例子:

n = 2, sp = 3
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]

同样:

n = 3, sp = 3
[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 1, 0]
[0, 2, 0]
[0, 1, 1]
[0, 1, 2]
[0, 2, 1]
[0, 2, 2]
[1, 0, 0]
[1, 0, 1]
[1, 0, 2]
[1, 1, 0]
[1, 2, 0]
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[1, 2, 2]
[2, 0, 0]
[2, 0, 1]
[2, 0, 2]
[2, 1, 0]
[2, 2, 0]
[2, 1, 1]
[2, 1, 2]
[2, 2, 1]
[2, 2, 2]

我希望保持我在示例中给出的顺序,即首先分配 LSB,然后是下一位,依此类推...

我想不出任何策略来解决这样的问题。我所能想到的就是使用sp 创建一个大小为sp 的临时列表,例如,如果sp == 3,则temp_list 可以是[0 0 0]。然后我们以某种方式进行迭代,以便获得模式。

算法的复杂度没有限制,虽然更短的算法会很好。

【问题讨论】:

  • 您的想法是一个好的开始!向我们展示您的代码尝试,我们一定能够帮助您解决问题。 :)
  • 我所能做的就是创建 2 个嵌套循环,从 LSB 开始,我们首先将 LSB 设置为 1,然后设置为 2,然后设置为 0。之后,我们移动到下一位并增加它并再次重复最里面的循环。它正在工作,但是对于更大的sp 值它会失败(我需要更多循环)。这就是为什么我对我的方法有所不同。 :D

标签: python algorithm list design-patterns


【解决方案1】:

一种简单的方法是:

def get_patterns(n, sp):
    ans = []

    def _get_patterns(so_far):
        if len(so_far) == sp:
            ans.append(so_far[:])
            return

        for i in range(n):
            so_far.append(i)
            _get_patterns(so_far)
            so_far.pop()

    _get_patterns([])
    return ans

n = 3
sp = 3

assert get_patterns(n, sp) == sorted([
    [0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], 
    [0, 2, 0], [0, 1, 1], [0, 1, 2], [0, 2, 1], [0, 2, 2],

    [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0],
    [1, 2, 0], [1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2],

    [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 1, 0], 
    [2, 2, 0], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2],
])

【讨论】:

  • 哇...谢谢你的方法。我现在知道你可以在函数中定义一个函数。它像“匿名”功能吗?无论如何,它完成了工作。非常感谢! :D
  • 是的,Python 允许一个函数在另一个函数中,它被称为nested functions
【解决方案2】:

这是我写的

n = 4 # base
sp = 2 # length

def fix(num, base):
    for j in range(len(num)):
        if num[j] == base:
            num[j] = 0
            num[j+1] += 1
    return num

num= [ 0 for _ in range(sp)]
print(num)
for i in range(n**sp -1):
    num[0] += 1
    num= fix(num, n)
    print(num[::-1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2015-12-27
    • 2020-12-05
    相关资源
    最近更新 更多