1. 程式人生 > >《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q22)

《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q22)

《程式設計師的演算法趣題》-(日)增井敏克 , 書中為69 道數學謎題編寫了解題程式, 程式語言為:Ruby,JavaScript,C語言。有興趣的同學,可以購書閱讀~

在此更新個人編寫的Python版,僅供學習使用。(執行環境:Python3.6)

Q22 不纏繞的紙杯電話
     繩子連線紙杯製作“紙杯電話”——這應該勾起了很多人對理科實驗的回憶。如果把繩子拉直,對著一邊的紙杯講話,聲音就可以從另一邊的紙杯傳出。
    假設有幾個小朋友以相同間隔圍成圓周,要結對用紙杯電話相互通話。如果繩子交叉,很有可能會纏繞起來,所以結對的原則是不能讓繩子交叉。
    舉個例子,如果有 6 個小朋友,則只要如圖一樣結對,就可以順利用紙杯電話通話。也就是說, 6 個人的時候,有 5 種結對方式。

                                              

問題
    求有 16 個小朋友的時候,一共有多少種結對方式?

def calculate(wait_connect_list):
    first_item = wait_connect_list.pop(0)
    total_count = 0
    for index in range(len(wait_connect_list)):
        if (wait_connect_list[index] - first_item - 1) % 2 == 0:
            right_list = wait_connect_list[:index]
            left_list = wait_connect_list[index+1:]
            if len(right_list) == 0 and len(left_list) == 0:
                total_count += 1
            elif len(right_list) == 0:
                total_count += calculate(left_list)
            elif len(left_list) == 0:
                total_count += calculate(right_list)
            else:
                total_count += calculate(right_list) * calculate(left_list)
    return total_count

print("共有%s種結對方式" % calculate([i for i in range(16)]))

執行結果:

                 共有1430種結對方式