2016-04-26 6 views
1

私は比較的新しいコーディングですが、フィボナッチシーケンスのモジュラスの特定の反復パターンを使用して結果の数値にトーンを割り当てたところ、episode of Numberphileがありました。私の知識を上手く試すには、ちょっとした実験ですね!リスト内のパターンの期間を見つける

私は単純なループを作成してフィボナッチシーケンスのリストを作成し、生成したシーケンスの残りの部分をnで除算して計算する別の関数を作成することができました。しかし、そのモジュラスリストのパターンの期間を見つけることは困難であることが判明しています。

は、ここで私がこれまで持っているものです。

#Fibonacci.py 
#Basic terms 
fiblist = list() 
inp = "> " 
n=None 

#Calculates the FIbonacci sequence 
def fib(n): 
    a,b = 0,1 
    while True: 
     try: 
      print "How many terms? " 
      n = int(raw_input(inp)) 
      if n <= 0: 
       print "Please enter a positive integer." 
       continue 
      else: 
       for i in range(0,n): 
        a,b = b, a + b 
        fiblist.append(a) 
       break 
     except ValueError: 
      print "Please enter a positive integer, not a letter or symbol" 
      continue  
    return fiblist 

#Calculates the modulo of each integer in fiblist 
def modulo(n): 
    print """ 
Do you want to find the modulo? 
1. Yes 
2. No""" 
    choice = raw_input(inp) 
    if choice =="1": 
     modlist = list() 
     print "What modulo do you want to use?" 
     modx = int(raw_input(inp)) 
     modlist = [x % modx for x in fiblist] 
     print modlist 
     print "The period of the pattern is ", principal_period(modlist) 
     print "Goodbye!" 
    else: 
     print "Goodbye!" 

#Calculates the period of the modulo pattern of the Fibonacci sequence 
def principal_period(modlist): 
    a = str(modlist) 
    i = (a+a).find(a, 1, -1) 
    return None if i == -1 else n[:i] 

print fib(n) 
modulo(n) 

私は常に返し

def principal_period(modlist): 
    a = str(modlist) 
    i = (a+a).find(a, 1, -1) 
    return None if i == -1 else n[:i] 

で失敗だ一部「なし」私は答えに関するスレッドover hereからこれを得ました。私は正直なところ、この答えをよく理解しておらず、私には望みの結果を与えていません。

指定されたリストの繰り返しパターンの期間を計算するための提案がありますか?

答えて

0

modlistは文字列ではなく整数のリストなので、失敗しています。このようなprincipal_periodに第二、第四のラインを変更します。

def principal_period(modlist): 
    a = ''.join(str(m) for m in modlist) 
    i = (a+a).find(a, 1, -1) 
    return None if i == -1 else a[:i] 

代わりのstr(modlist)あなたが長い文字列に数字を参加させる必要があり、あなたが最後の行にタイプミスがあったが、代わりにa[:i]n[:i]。今、このプログラムを実行する

は示しています

How many terms? 
> 9 
[1, 1, 2, 3, 5, 8, 13, 21, 34] 

Do you want to find the modulo? 
1. Yes 
2. No 
> 1 
What modulo do you want to use? 
> 2 
[1, 1, 0, 1, 1, 0, 1, 1, 0] 
The period of the pattern is 110 
Goodbye! 

は何この出力についての興味深いのはフィボナッチ数が偶数、奇数、偶数のシーケンスに従うことです。 99の言葉で試してみてください!

+0

これは私のために働かなくなった。私はあなたが示唆したようにコードを変更しましたが、依然としてこの期間にNoneレスポンスを得ました。 – Tupperward

+0

これはいくつの用語でも機能しません。 9と99を試しましたか? –

+0

これは9と99で動作しましたが、すべての期間にわたって機能していません。また、パターンが繰り返される前にlen(principal_period(modlist))を見つけてmodlist内の用語の数を取得することもできました。これは私が探していた期間でした。しかし、私が12のような言葉を使うと、len(None)のTraceBackを与えてNoneを与えてくれます。さらに、この解決策は、modx = 2のときのみ機能します。 – Tupperward

関連する問題