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