Quand je pensais au problème FizzBuzz, j'ai également programmé le problème "Créer un programme qui génère et affiche 45 séquence Fibonacci (pour le moment)". Je commence à me demander si cela pourrait être une sorte d'indicateur pour. Consultez les balises de cet article et les commentaires de l'exemple de code pour savoir ce que vous voulez dire.
L'exécution de l'exemple de programme suivant (hors commentaires) a été confirmée sur ce site.
fib.c
#include <stdio.h>
// #define NOT_TAILRECUR
#ifdef NOT_TAILRECUR
unsigned long long fib(int x)
{
if (x == 0)
return (0);
else
if (x == 1)
return (1);
else
return (fib(x-1) + fib(x-2));
}
#else
unsigned long long fib_r(
int x,
unsigned long long a,
unsigned long long b)
{
if (x == 0)
return (a);
else
return (fib_r(x-1, b, a+b));
}
unsigned long long fib(int x)
{
return (fib_r(x, 0, 1));
}
#endif
int main(void)
{
for (int n = 0; n < 45; n++)
printf("%llu ", fib(n));
printf("\n");
return (0);
}
fib.py
#### not tail-recur
#def fib(x):
# if x == 0:
# return (0)
# elif x == 1:
# return (1)
# else:
# return (fib(x-1) + fib(x-2))
def fib(x):
def fib_r(x,a,b):
if x == 0:
return (a)
else:
return (fib_r(x-1, b, a+b))
return (fib_r(x,0,1))
for i in range(45):
print(fib(i), "", end="")
fib.scm
;;;; not tail-recur
;(define fib
; (lambda (x)
; (cond ((equal? x 0) 0)
; ((equal? x 1) 1)
; (else
; (+ (fib (- x 1)) (fib (- x 2)))))))
(define fib
(lambda (x)
(let loop ((x x) (a 0) (b 1))
(if (equal? x 0) a (loop (- x 1) b (+ a b))))))
(print (map fib (iota 45)))
Recommended Posts