Pythonがジョセフリング問題を実現する方法


本論文の実例は、Pythonがジョセフ環問題を実現する方法を述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
タイトル:0,1,…,n-1というn個の数字を丸のように並べて、数字0から始める度にこの丸からm番目の数字を削除します。この丸の中の最後の数字を求めてください。
関数f(n,m)を定義して、n個の数字(0,1,…,n−1)の度にm番目の数字を削除した後に最後に残る数字を表します。
n個の数字のうち、最初に削除された数字がkであるとすると、kを削除した後に残るn−1個の数字は0〜k−1、k 1〜n−1となり、次の削除は、デジタルk 1からカウントされる。第二のシーケンスの最後に残った数字はつまり私達が要求する数字です。そこで、残りのn-1個の数字について、k 1番は0、k 2番は1、…、0番はn-k-1、1番はn-k、k-1番はn-2とし、f(n-1,m)=x、つまりn-1個の数のうち、m番目を削除するたびに、最後に残った数字番号はxとします。デリバリー関係が得られます。
f(n,m)=0,n=1
f(n,m)=[f(n-1,m)+m]%n>1
Pythonコード:

#coding=utf8
'''
  :0,1,...,n-1 n         ,   0             m   。                。
'''
def josephus(n, m):
  if type(n) != type(1) or n <= 0:
    raise Exception('n must be an integer(n > 0)')
  if n == 1:
    return 0
  else:
    return (josephus(n - 1, m) + m) % n
if __name__ == '__main__':
  print josephus(8, 3)
  print josephus(1, 2)
  print josephus(0, 2)
Pythonに関する詳細については、当駅のテーマを見ることができます。「Python正則表現の使い方のまとめ」、「Pythonデータ構造とアルゴリズム教程」、「Python Socketプログラミング技術のまとめ」、「Python関数使用テクニックのまとめ」、「Python文字列操作テクニックのまとめ」、「Python入門と階段の経典教程」および「Pythonファイルとディレクトリ操作の概要
ここで述べたように、皆様のPythonプログラムの設計に役に立ちます。