python - ciąg fibbonaciego, moduł

0

Stwórz modułfib2 zawierający dwie funkcje zwracające n -tą liczbę
Fibonacciego — obliczoną w pętli, oraz ze wzoru Bineta
Moduł ma też zawierać bezargumentową funkcję test, której zadaniem jest
sprawdzenie poprawności działania napisanych funkcji i wypisanie
odpowiedniego komunikatu. Test powinien być wykonany dla pewnych
ustalonych wartości, w szczególności tych granicznych, czyli 0, 1, 2 i innych.

Następnie napisz moduł
fib2-czas, który wykorzystuje moduł
fib2 i moduł time, aby porównać szybkość wykonywania obu algorytmów. Wynik
powinien zostać wypisany w postaci tabelki.

To co potrafię:

import time
 
def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a+b
    return a
print fib(20)



start = time.time()
def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a+b
    return a
print fib(20)
stop = time.time()
print "czas wykonywania:", stop - start

O co proszę? Proszę o pomoc:

  • ze wzorem Bineta(podsyłam link)//pl.wikipedia.org/wiki/Ci%C4%85g_Fibonacciego#Wz.C3.B3r_Bineta
  • nie bardzo wiem jak napisać tę funkcję testową
    Z resztą powinienem sobie poradzić, pozdrawiam
1
def binetFibb(n):
	a = (1.0 + 5.0**0.5) / 2.0
	b = (1.0 - 5.0**0.5) / 2.0
	return long(((a**(float(n)+1.0)) - (b**(float(n)+1.0))) / (a-b))
	
print binetFibb(6)

W swoim kodzie masz 2 razy masz def tej samej funkcji - nie musisz tego robić.

Funkcję testową najlepiej przygotuj jako obiekt z modułem unittest - https://docs.python.org/2/library/unittest.html
Będziesz miał test jednostkowy, który sprawdza, czy dla odpowiednich argumentów funkcja zwraca prawidłowe wyniki.
Chociaż pewnie leniwemu prowadzącemu chodzi o normalny test, który np. porówna czy binetFibb(6) == 13.

Pamiętaj o podziale na moduły. Bo teraz piszesz wszystko w jednym pliku. Same defy funkcji (fib, binetFibb i test) mają być w module fib2, sprawdzanie czasowe ma być w odrębnym module fib2-czas.

0

Więcej zrozumiałem, niż z ćwiczeń, wielkie dzięki :)

0

Moduł fib2:

# -*- coding: utf-8
'''
Moduł liczy ciąg fibonacciego. Najpierw z funkcji fibonacciego, potem ze wzoru Bineta.
'''
def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a+b
    return a
if __name__=='__main__':
    print fib(n)



def binetFibb(n):
    a = (1.0 + 5.0**0.5) / 2.0
    b = (1.0 - 5.0**0.5) / 2.0
    return long(((a**(float(n))) - (b**(float(n)+1.0))) / (a-b))
if __name__=='__main__':
    print binetFibb(n)

Moduł fib2-czas:

# -*- coding: utf-8
import time
import fib2
from fib2 import fib,binetFibb


start = time.time()
print fib(20)
stop = time.time()
print "czas wykonywania 1:", stop - start

start = time.time()
print binetFibb(20)
stop = time.time()
print "czas wykonywania 2:", stop - start

Dobrze to robię?

Jednak z tą funkcją testową mieszam i nie potrafię tego rozpisać.

1

Jak już w module chcesz pisać maina, to raz, a nie dwa razy i nie wpisuj n jako argument, bo ono nic nie znaczy w tym miejscu:

if __name__=='__main__':
    print fib(4)
    print binetFibb(4)

Funkcję testową bym zrobił w taki sposób (jeśli to nie ma być test jednostkowy)

 def subTest(n, spodziewanyWynik):
    f = fib(n)
    b = binetFibb(n)
    print "n = %d, F(n) = %d, fib(n) = %d, binetFibb(n) = %d, OK: %r;"%(n, spodziewanyWynik, f, b, f == spodziewanyWynik and b == spodziewanyWynik)
def test():
    subTest(0, 1)
    subTest(1, 1)
    subTest(3, 3)
    subTest(6, 13)

Pisane z palca, może nie działać.

0

Jeszcze raz dzięki :-)
PS. Temat do zamknięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1