Il programma stampa il numero n di serie di Fibonacci.
Questo programma non stampa nulla. Se visualizzi l'output, è probabilmente perché lo stai chiamando dalla read-eval-stampa -loop (REPL), che legge un modulo, lo valuta e quindi stampa il risultato. Ad esempio, si potrebbe fare:
CL-USER> (fibonacci 4)
2
Se avvolto la chiamata in qualcosa d'altro, però, vedrete che non è nulla di stampa:
CL-USER> (progn (fibonacci 4) nil)
NIL
Come hai questo scritto, sarà difficile modificarlo per stampare ogni numero di fibonacci una sola volta, dato che si esegue un grande calcolo ridondante. Per esempio, la chiamata a
(fibonacci (- n 1))
calcolerà (fibonacci (- n 1))
, ma così sarà la chiamata diretta al
(fibonacci (- n 2))
Questo significa che probabilmente non si vuole ogni chiamata a fibonacci
per stampare l'intera sequenza. Se lo fai, però, notare che (print x)
restituisce il valore di x
, in modo da poter semplicemente fare:
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((print (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))))
CL-USER> (progn (fibonacci 6) nil)
1
2
1
3
1
2
5
NIL
vedrete alcune parti ripetute lì, perché non c'è calcolo ridondante.È possibile calcolare la serie in modo più efficiente, tuttavia, a partire dai primi due numeri, e contando su:
(defun fibonacci (n)
(do ((a 1 b)
(b 1 (print (+ a b)))
(n n (1- n)))
((zerop n) b)))
CL-USER> (fibonacci 6)
2
3
5
8
13
21
In realtà, non sono autorizzato a utilizzare la funzione di inversione. Devo farlo in una singola funzione ricorsiva, senza usare alcuna funzione intrinseca come la retromarcia. Grazie comunque. – wackyTechie
@wackyTechie Dovresti menzionare le restrizioni nella tua domanda. Ho aggiunto come farlo senza un accumulatore. – Sylwester
Sì, l'ho capito dopo. Molte grazie! – wackyTechie