2016-04-26 17 views
1

Ich bin relativ neu in der Codierung, aber ich sah eine große episode of Numberphile, wo sie ein bestimmtes sich wiederholendes Muster des Moduls der Fibonacci-Sequenz verwenden, um Töne zu der resultierenden Zahl zuzuweisen. Was für ein großartiges kleines Experiment, um mein Wissen zu testen!Finden der Periode eines Musters in einer Liste

So konnte ich eine einfache Schleife erstellen, um eine Liste der Fibonacci-Sequenz und eine andere Funktion zu erstellen, um den Rest der generierten Sequenz nach dem Dividieren durch n zu berechnen. Aber es ist schwierig, die Periode des Musters in dieser Modulliste zu finden.

Hier ist, was ich bisher:

#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) 

Der Teil, der mich hat versagt ist

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

die „None“ Ich habe dies aus dem Thread over here in Bezug auf die Antwort immer wieder. Ich verstehe diese Antwort wirklich nicht sehr gut und es gibt mir nicht das gewünschte Ergebnis.

Haben Sie Vorschläge zur Berechnung der Periode eines sich wiederholenden Musters in einer gegebenen Liste?

Antwort

0

Es schlägt fehl, weil modlist eine Liste von Ganzzahlen ist, keine Zeichenfolgen. Ändern Sie die zweite und vierte Zeile in principal_period wie folgt aus:

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] 

Statt str(modlist) Sie müssen die Zahlen in einer langen Kette verbinden, und man hatte einen Tippfehler in der letzten Zeile, n[:i] statt a[:i].

Das Ausführen dieses Programms zeigt nun:

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! 

Was ist mit diesem Ausgang interessant ist, dass Fibonacci-Zahlen der Folge ungerade folgen, ungerade, gerade. Versuchen Sie es mit 99 Begriffen!

+0

Dies endete für mich nicht funktioniert. Ich habe den Code so geändert, wie Sie es vorgeschlagen haben, aber ich habe immer noch keine Antwort auf diesen Zeitraum erhalten. – Tupperward

+0

Es funktioniert nicht mit einer beliebigen Anzahl von Begriffen. Hast du 9 und 99 probiert? –

+0

Das hat mit 9 und 99 funktioniert, aber es funktioniert nicht für alle Längen von Begriffen. Ich konnte auch die len (principal_period (modlist)) finden, um die Anzahl der Begriffe in modlist zu erhalten, bevor das Muster wiederholt wird. Das war die Zeit, nach der ich gesucht habe. Wenn ich jedoch einen Begriff wie 12 verwende, liefert er mir eine None, die ein TraceBack für len (None) gibt. Außerdem scheint diese Lösung nur zu funktionieren, wenn modx = 2 ist. – Tupperward