publicMasters/python/2/5Fib.py

205 lines
3.7 KiB
Python
Raw Normal View History

2022-10-26 08:34:51 +02:00
#! /usr/bin/python3
# -*- coding: utf-8 -*-
def fib2(n): # return Fibonacci series up to n
"""Return a list containing the Fibonacci series up to n."""
result = []
a, b = 0, 1
while a < n:
result.append(a) # see below
a, b = b, a+b ### Attention subtil!
return result
# print(fib2(4))
# ==============
# Monde séquentiel 1
# a=3
# b=7
# a=b
# b=a+b
# a=7
# b=7+7=14
# =============
# Monde séquentiel 2
# a=3
# b=7
# b=a+b
# a=b
# b=10
# a=10
# =============
# Monde simultané.
# a=3
# b=7
# idem
# a,b=3,7
# idem
# b=7
# a=3.
# pas de différence dans ce cas.
# Par contre si je fais maintenant
# a, b = b, a+b ### Attention subtil!
# signifie que maintenant :
# a vaut 7 (valeur de b avant de faire le changement)
# b vaut 10 (valeur de a+b avant de faire le changement)
# ===
# a, b = b, a+b ### Attention subtil!
# a
# b
# (avant)
# c=a+b # variable annexe
# a=b
# b=c
# Maintenant a vaut bien la valeur de b avant
# et b vaut bien la valeur de la somme de a et b avant.
# La formule de math dit :
# la valeur de la suite pour 0 c'est 0
# la valeur de la suite pour 1 c'est 1
# la valeur de la suite pour n+2 c'est la somme des valeurs de la suite pour n+1 et pour n.
# f(0)=0
# f(1)=1
# f(n+2)=f(n+1)+f(n)
#
# f(6) = f(5) + f(4) = 5 + 3 = 8
# f(5) = f(4)+ f(3) = 3 + 2 = 5
# f(4) = f(3) + f(2) = 2 + 1 = 3
# f(3) = f(2) + f(1) = 1 + 1 = 2
# f(2) = f(1) + f(0) = 1 + 0 = 1
#
#
def f(n):
"""calcul de la suite de fibonacci (récursif comme dans la définition)"""
print(" I ")
if (n == 0 ) :
return 0
elif (n == 1) :
return 1
else :
return f(n-1)+f(n-2)
# print(f(0))
# print(f(1))
# print(f(2))
# print(f(3)) ### affiche 5 fois le " I ". Pourquoi?
# print(f(4)) ### même question? affiche 9 fois le " I ". Pourquoi?
# print(f(5))
# # f(3)?
# I
# return f(2)+f(1) #en attente du calcul de f(2) et de f(1)
# # f(2)
# I
# return f(1)+f(0) #en attente du calcul de f(1) et de f(0)
# # f(1)
# I
# # f(0)
# I
# # calcul fini
# # f(1)
# I
# ####
# # f(4)
# I
# #f(3)
# I
# #f(2)
# I
# #f(1)
# I
# +
# #f(0)
# I
# +
# #f(1)
# I
# +
# #f(2)
# I
# #f(1)
# I
# +
# #f(0)
# I
### plus simple avec une boucle
# for n in range(1,10):
# print("f("+ str(n) + ")="+ str(f(n)))
#début.
#a,b = 0,1 = f(0), f(1) # = f(n-2), f(n-1)
#a,b = b, a+b # = f(n-1), f(n-2)+f(n-1) qui vaut bien f(n) d'après la définition
def fib3(n): # return Fibonacci series up to n
"""Return the nth value of the sequence"""
a, b = 0, 1
blanc=" "
dec=""
while a < n:
a, b = b, a+b ### Attention subtil!
dec+=blanc
print(dec,a,b)
return b
print(fib3(4))
# def f(n):
# """calcul de la suite de fibonacci (récursif comme dans la définition mais en évitant de refaire des calculs)"""
# if (n == 0 ) :
# return 0
# elif (n == 1) :
# return 1
# else :
# return f(n-1)+f(n-2)
# 8*8 cases et 16*2 pièces.
# le joueur qui doit jouer (2 possiblités)
# le nombre de positions de pièces sur l'échiquiers.
# 32
#
# 64*63*62*...*32
#
# 5 pièces choisies roi noir, roi blanc, fou noir de la case noir, un pion noir, un pion blanc
# 64*63*62*61*60 possibilités au plus
# *2 pour le joueur dont c'est le tour.
# python dit : 1 829 882 880.
#
# il faut encore choisir toutes les combinaisons de 5 pièces possibles.
# /2 en échangeant le rôle de noir et blanc
# symétries gauche/droit
# roi noir, roi blanc
# 3 pièces à choisir parmi 15+15
# 30*29*28
# En gros au plus :
# 22 287 973 478 400
#
# Pour le Go non plus maintenant.
# Pour les échecs plus maintenant.
# pour battre Kasparov oui.