Rekurencja w Python'ie i nieszczęśliwy ciąg Fibonacciego
-
jacek
06/01/2020
- Programowanie
- 2651 czytań 0 komentarzy
#!/usr/bin/python3 #------------------------------------------------------------------------------- # Name: funkcje i rekurencja # Purpose: python 3.7 i 3.6 # # Author: Jacek Patka # # Created: 6-01-2020 # Copyright: (c) astronom 2020 # Licence: Jacek Patka - sekcjaastronomiczna@wp.pl #------------------------------------------------------------------------------- # -*- coding: UTF-8 -*- # Źródło http://uoo.univ.szczecin.pl/~jakubs/py/py8.html # funkcja i argumenty o zmiennej liczbie #suma argumentów def sum(*arg): s=0 for x in arg: s+=x return s #suma rekurencyjnie def suma(*n): if n: return n[0]+suma(*list(n)[1:]) #konwersja na listę, gdyż krotka nie może być przycięta else: return 0 #silnia liczby n! = (n-1)*n def silnia(n): if n>1: return n*silnia(n-1) else: return 1 # ciąg fibonacciego fibo(50) - nie używaj jej bo liczny strasznie długo '''fibo(50) Czekamy, czekamy, a wyniku jak nie było, tak nie ma. Najsensowniej będzie przerwać działanie funkcji wciskając kombinację klawiszy CTRL+C. Dlaczego funkcja liczy tak powoli? Każde wywołanie funkcji powoduje jej ponowne dwukrotne wywołanie dla n>=2. A zatem, dla n=50, liczba wywołań funkcji wyniesie około 249 razy. Nawet jeśli pojedyncze wywołanie funkcji zabiera tylko jedną dziesięciomilionową sekundy, to wykonanie 249 wywołań zajmie komputerowi prawie dwa lata. ''' def fibo(n): if n<2: return n else: return fib(n-1)+fib(n-2) # poprawna funkcja jw. def fib(n): if n<2: return n a, b = 0, 1 # 0 podstawiamy pod a, 1 pod b for x in range(1, n): # potrzebujemy n-1 iteracji a, b = b, a+b # b podstawiamy pod a, sumę pod b return b
Dodaj komentarz
Zaloguj się, aby móc dodać komentarz.
Oceny
Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony
Zaloguj się , żeby móc zagłosować.
Zaloguj się , żeby móc zagłosować.
Brak ocen. Może czas dodać swoją?