盒子裡n個小球,每個小球有不相同的編號。從裡面取出m個小球,有取出順序要求。求解有多少情況
def pick(a,n,l=()):
for x in a:
if x not in l:
if len(l)==n-1:
yield (x,)
else:
for res in pick(a,n,l+(x,)):
yield (x,)+res
比如5個小球,取3個。帶入後結果為:
a=[1,2,3,4,5]
print list(pick(a,3))
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 4, 2), (1, 4, 3), (1, 4, 5), (1, 5, 2), (1, 5, 3), (1, 5, 4), (2, 1, 3), (2, 1, 4), (2, 1, 5), (2, 3, 1), (2, 3, 4), (2, 3, 5), (2, 4, 1), (2, 4, 3), (2, 4, 5), (2, 5, 1), (2, 5, 3), (2, 5, 4), (3, 1, 2), (3, 1, 4), (3, 1, 5), (3, 2, 1), (3, 2, 4), (3, 2, 5), (3, 4, 1), (3, 4, 2), (3, 4, 5), (3, 5, 1), (3, 5, 2), (3, 5, 4), (4, 1, 2), (4, 1, 3), (4, 1, 5), (4, 2, 1), (4, 2, 3), (4, 2, 5), (4, 3, 1), (4, 3, 2), (4, 3, 5), (4, 5, 1), (4, 5, 2), (4, 5, 3), (5, 1, 2), (5, 1, 3), (5, 1, 4), (5, 2, 1), (5, 2, 3), (5, 2, 4), (5, 3, 1), (5, 3, 2), (5, 3, 4), (5, 4, 1), (5, 4, 2), (5, 4, 3)]
這裡參考之前的八皇后寫法,用l保留已取出小球。
每取出乙個小球,檢查跟已取出小球是否重複。不重複的小球則判斷,已取出小球數量是否為n-1個:
是:則取出的小球為最後乙個,將這個小球編號返回迭代
否:則將遞迴取球操作,遞迴時將已取出小球帶入遞迴前置條件 l+(x,) 直至已取出小球數量達到倒數第二個。然後從後往前迭代出完整結果
在函式中加入列印資訊後看看
# -*- coding: cp936 -*-
def pick(a,n,l=()):
for x in a:
#print '進入迭代:pick(a,%d,%s)' % (n,str(l))
if x not in l:
print 'x取:%d' % x
print '進入迭代:pick(a,%d,%s)' % (n,str(l))
print 'l=%s' % str(l)
if len(l)==n-1:
yield (x,)
else:
for res in pick(a,n,l+(x,)):
print 'res=%s,反饋結果:%s' % (str(res),str((x,)+res))
yield (x,)+res
else:
print 'x取%d,l=%s,取值失敗' % (x,str(l))
a=[1,2,3]
print list(pick(a,3))
部分結果為:
x取:1
進入迭代:pick(a,3,())
l=()
x取1,l=(1,),取值失敗
x取:2
進入迭代:pick(a,3,(1,))
l=(1,)
x取1,l=(1, 2),取值失敗
x取2,l=(1, 2),取值失敗
x取:3
進入迭代:pick(a,3,(1, 2))
l=(1, 2)
res=(3,),反饋結果:(2, 3)
res=(2, 3),反饋結果:(1, 2, 3)
可以看出:
1. 首次x取1,進入迭代pick(a,3,())。由於l個數不足2,進行遞迴pick(a,3,(1,)),此時 (x,)+res 中的 (x,)為(1,)
2.在遞迴函式 pick(a,3,(1,)) 中,x再次取1失敗,x取2。由於l個數不足2,進入遞迴pick(a,3,(1,2)),此時 (x,)+res 中的 (x,)為(2,)
3.在遞迴函式 pick(a,3,(1,2))中,x取1,2失敗,x取3。由於l個數為2,迭代結果為 3。返回上一層函式pick(a,3,(1,)) , res取值(3,),由於(x,)的值為(2,),所以(x,)+res 的結果為(2,3)
4.將結果再返回上一層函式pick(a,3,()),res取值為(2,3),由於由於(x,)的值為(1,),所以(x,)+res 的結果為(1,2,3)
小球下落問題
乙個二叉樹的深度為d,有 i i的大寫 個小球,每個小球依次從頭結點開始下落,每個結點處有個開關,若開關關閉,則往左邊走,若開關開啟,則往右邊走。求最後乙個小球小落的最終位置。輸入多組資料,每組資料第一行為d 20 和 i 輸出為最後小球位置 即所在的葉結點 方法一 思想 若結點按層序遍歷的編號為k...
小球稱重問題求解
題目論述 12個長相一樣的球中僅有 1個球與其他球質量不同,且不確定是重還是輕。請用天枰進行不超過三次的稱重,檢測出是哪個球與眾不同,並且要得出是重還是輕的結論。為敘述方做如下定義。定義1 與眾不同的球為x球,11個相同的球為 o球,若與眾不同的球比其他 11個球重,則為重球,否則為輕球。定義2 稱...
12小球稱重問題
有12個小球,有乙個質量和其它十乙個不一樣,不知道是重還是輕。用乙個天秤稱三次,把這個質量不同的球給區別出來 將12個小球編號 1 c 1對比 1234 5678 1.11234 5678,則壞球在9abc中,第二次稱 1239 56ab 1.1.11239 56ab,則壞球是c 1.1.21239...