Problem mit str und int

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Für "get_fibonacci_numbers" wäre hier ein (unendlicher) Generator besser angebracht.
Das Leben ist wie ein Tennisball.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@Eydu: stimmt natürlich

Code: Alles auswählen

In [1]: def get_fibo():
   ...:     a, b = 0,1
   ...:     while True:
   ...:         a, b = b, a + b
   ...:         yield a
   ...:

In [2]: import itertools

In [3]: l = list(itertools.takewhile(lambda n: n<1000, get_fibo()))

In [4]: l
Out[4]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]


Gibt es eigentlich irgendeine Anwendung für Fibonacci-Zahlen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Tauchen eigentlich überall mal mehr oder weniger unerwartet auf. Hier ist so einiges aufgelistet, bin es aber selber nicht durchgegangen.
Das Leben ist wie ein Tennisball.
BlackJack

@b.esser-wisser: `itertools.islice()` ist IMHO weniger umständlich als `takewhile()` + ``lambda``.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Fuer grosse n stoesst Du aber schnell an die Grenzen Deines PCs. In diesem Dokument http://www.mathematik.uni-muenchen.de/~ ... zth_01.pdf ist eine Methode beschrieben mit der man fib(n) wesentlich schneller berechnen kann. Mal nach der 2x2 Matrix mit den drei Einsen und der einen Null suchen. Ist auch eine schoene Uebung das mal umzusetzen.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@BlackJack: da hatte ich irgendwie nicht dran gedacht - mein Gedankengang war an 'nimm solange zahl kleiner n' hängengeblieben :K

@hendrikS:
Das ginge dann so, oder?

Code: Alles auswählen

import itertools
import numpy as np

def fibo():
    fibo_matrix = np.matrix([[1., 1.0], [1., 0.]])
    akku = fibo_matrix.copy()
    fibo_matrix **= 3
    exponent = 2
    while True:
        yield akku[1,1]
        yield akku[0,1]
        yield akku[0,0]
        akku *= fibo_matrix

for n in itertools.islice(fibo(), 1000): #hart an der grenze von 'float'
    print n
Um für jeden Spatz die passende Kanone zu haben ;)

scnr, Jörg
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

b.esser-wisser hat geschrieben:@hendrikS:
Das ginge dann so, oder?
Ja genau, Prinzip erkannt. Deine Lösung hat aber ein paar Schönheitsfehler. Ich hatte mich gefragt warum Du floats verwendest, wo man doch auschliesslich addiert oder multipliziert. Bis ich dann gesehen habe, dass bei grösseren Exponenten negative Werte rauskommen. Ist n'bisschen doof.
Also die Challenge ist dann, die Funktion selber zu schreiben, die sozusagen [[1,1],[1,0]]**n berechnet.

Edit: Wenn Du alle fibs von 1..n berechen möchtest, ist der vorherige Algo natürlich besser. Macht so nur sinn wenn man einzelne bestimmte Fibozahlen bestimmen möchte. Insofern ist wahrscheinlich auch Dein Generator überflüssig.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wer Spaß an großen und kleinen Fibonacci-Zahlen, an schnellen und kurzen Algorithmen zur Berechnung von Fibonacci-Zahlen hat und sich mal so richtig austoben möchte der kann das z.B. hier tun:

- Fibonacci Numbers (Golf)
- Flibonakki
- How Many Fibs
- Fibonacci Sequence
- Fibonacci Factor
- Interesting Determinant
- The Very Greatest Common Divisor
- Counting Rabbits
- Sum of Products
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

numerix hat geschrieben:Wer Spaß an großen und kleinen Fibonacci-Zahlen, an schnellen und kurzen Algorithmen zur Berechnung von Fibonacci-Zahlen hat und sich mal so richtig austoben möchte der kann das z.B. hier tun:
Und das:
- Alphacode
Antworten