《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q22)
阿新 • • 發佈:2018-12-14
《程式設計師的演算法趣題》-(日)增井敏克 , 書中為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種結對方式