from functools import lru_cache
@lru_cache(maxsize=1000)
def fibonacci(n):
if n == 1 or n == 0:
return 1
if n == 2:
return 2
if n > 2:
return (fibonacci(n-1) + fibonacci(n-2))
def ordinal(n):
return "%d%s" % (
n,
"tsnrhtdd"[(n / 10 % 10 != 1) * (n % 10 < 4) * n % 10 :: 4],
)
while True:
try:
while True:
try:
n = int(input("Pick your Fibonacci number: "))
if type(n) == int:
break
except Exception:
print("It must be a positive integer")
if n < 1:
raise ValueError("It must be a positive integer")
else:
while True:
try:
q = input("Series? [y/n] ")
if q == "y" or q == "n":
break
print("Your answer must be 'y' or 'n'")
except:
raise TypeError("Your answer must be 'y' or 'n'")
if q == "y":
try:
for n in range(1,n+1):
print(n, ":", fibonacci(n-1))
except RecursionError:
print("Your computer doesn't have the capacity for such calculations!")
elif q == "n":
print(f"The {ordinal(n)} Fibonacci number is {fibonacci(n-1)}.")
else:
raise ValueError("answer must be y or n")
except RecursionError:
print("Your computer doesn't have the capacity for such calculations!")
quit = input("Another one? [y/n] ")
if quit != "y" and q != "n":
print("Your answer must be 'y' or 'n'")
elif quit == "y":
continue
else:
break
Comments