2013-10-30 63 views
0

我正在嘗試編寫一個這樣的函數:返回所有二進制數字,並且按照排序順序。每個二進制數字都表示爲一個元組。調用AllBinary(N)的結果是一個包含2^N個二進制數的元組。例子:可能的二進制數函數Python

AllBinary(2) 
[(0, 0), (0, 1), (1, 0), (1, 1)] 

我想寫使用一個for或while循環的功能。這是我的代碼:

def AllBinary(N): 
    c =[] 
    for i in range(2**N): 

我想我可以使用循環累積由具有循環創建的二進制元組,然後將它們添加到空列表C解決這個問題。但我不知道我將如何編寫循環來獲取這些二元元組。

+0

獲取整數的二進制數字有很多種方法,但需要注意的是'%'運算符(重複使用)和'bin'內建函數。 –

+0

忘記添加:我不想在函數中導入語句。 – user2929403

+0

@SteveJessop,不要忘記'''和'&' –

回答

0

這被稱爲功率集。

這裏有大量的複製粘貼算法。但是,2^n很多+ Python的開銷(如果我正確記得,它是每個int 12個字節),32個數字會給你每個字節4GB,所以4 * 12 = 48GB的內存要存儲。

如果一個數字是在這個功率集中,這將是微不足道的。

由於有限功率集是可數的,因此瞭解發電機和發電量也是一個很好的藉口。

0
def AllBinary(N): 
    c =[] 
    for i in xrange(2**N): 
     c.append(tuple(bin(i)[2:].zfill(N))) 
    return c 

說明:

  • for i in xrange(2**N): - 注意:使用xrange代替range這裏更有效率。希望你已經理解了爲什麼我們在0到2^N之間迭代的原因。
  • bin(i) - 將i轉換爲二進制表示形式。例如50b101
  • bin(i)[2:] - 扔掉表示二進制表示,在這種情況下是0b
  • bin(i)[2:].zfill(N)前兩個字符 - 現在零墊最左邊的零,因爲我們想要N個數位
  • tuple(...) - 轉換到這個元組
  • c.append(...) - 每個這樣的元組添加到列表c
  • return c - 要麼返回這個或打印,或做什麼是你需要assignmen噸。
+0

我想解決它沒有內置bin功能。 – user2929403

3
def AllBinary(N): 
    import itertools 
    return itertools.product((0, 1), repeat=N) 

例子:

>>> for t in AllBinary(3): 
... print t 

(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 
0

使用沒有其他功能的要求遞歸執行:

def all_bin(n): 
    if n == 1: 
     return [(0,), (1,)] 
    return [(i,) + b for i in (0, 1) for b in all_bin(n - 1)] 
1

你只需要2個行添加到你有什麼

>>> def AllBinary(N): 
...  c =[] 
...  for i in range(2**N): 
...   c.append(tuple((i>>j)&1 for j in reversed(range(N)))) 
...  return c 
... 
>>> AllBinary(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)] 

如果你不喜歡使用按位運算符是(雖然效率較低)

>>> def AllBinary(N): 
...  c =[] 
...  for i in range(2**N): 
...   c.append(tuple((i//2**j)%2 for j in reversed(range(N)))) 
...  return c 
... 
>>> AllBinary(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)] 
0

可以使用嵌套的for循環來解決這個問題

def AllBinary(num): 
    result, binary = [[]], (0, 1) 
    for total in xrange(num): 
     result = [i + [j] for i in result for j in binary] 
    return result 

print AllBinary(2) 
print AllBinary(3) 

輸出

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

備註:與使用itertools.product相同,但我們不h大約到import什麼。