筆試題記錄(一羣小朋友排隊,每個人都不站在之前的位置,有幾種站法?)

今天碰到的一個題:
一羣小朋友排隊,每個人都不站在之前的位置,有幾種站法?

設n個人符合要求的不同坐法有f(n)種

f(1)=0, f(2)=1

當n=3時,若無限制,則有3!種坐法。須減去坐原位的。
若1人坐原位,另2人不坐原位,則有C(3,1)*f(2)種
若2人坐原位,則第3人必坐原位,有1種
則f(3)=3!-C(3,1)*f(2)-1=6-3-1=2


當n=4時,若無限制,則有4!種坐法。須減去坐原位的。
若1人坐原位,另3人不坐原位,則有C(4,1)*f(3)種
若2人坐原位,另2人不坐原位,則有C(4,2)*f(2)種
若3人坐原位,則第3人必坐原位,有1種
則f(4)=4!-C(4,1)*f(3)-C(4,2)*f(2)-1=24-8-6-1=9
依此法,
f(5)=5!-C(5,1)*f(4)-C(5,2)*f(3)-C(5,3)*f(2)-1可求
f(6),f(7),……f(k-1)可求


n=k時,若無限制,則有k!種坐法。須減去坐原位的。
若1人坐原位,則有C(k,1)*f(k-1)種
若2人坐原位,則有C(k,2)*f(k-2)種
……
若k-2人坐原位,則有C(k,k-2)*f(2)種
若k-1人坐原位,則有1種
則f(k)=k!-C(k,1)*f(k-1)-C(k,2)*f(k-2)-……-C(k,k-2)*f(2)-1


一般地
f(n)=n!-C(n,1)*f(n-1)-C(n,2)*f(n-2)-……-C(n,n-2)*f(2)-1

python中遞歸爲調用自己,且要有最終的終止條件:

def fact_iter(num, product):
    if num == 1:  #終止條件
        return product
    return fact_iter(num - 1, num * product)

所以上述題目代碼爲:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章