Rekurencja w Python'ie i nieszczęśliwy ciąg Fibonacciego
Dodane przez jacek dnia 06/01/2020 16:06:19
#!/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