取小球問題

2021-06-22 01:59:26 字數 2533 閱讀 4618

盒子裡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...