#! /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.
