Effectivement, j'utilise d'habitude la fonction trace de l'interpréteur. Le but de cet exercice était pour moi de tracer le code "de l'intérieur" dans différentes situations. C'est pour cela que la reconstruction avec LET, bien qu'elle fonctionne parfaitement, ne me plaisait pas trop car elle demande quand même une certaine réécriture. La trace de lisp donne le même résultat:
1 2 3 4
| (defun iter (product counter n)
(if (> counter n)
product
(iter (* counter product) (+ counter 1) n))) |
CL-USER> (trace iter)
;; Tracing function ITER.
(ITER)
CL-USER> (iter 1 1 3)
1. Trace: (ITER '1 '1 '3)
2. Trace: (ITER '1 '2 '3)
3. Trace: (ITER '2 '3 '3)
4. Trace: (ITER '6 '4 '3)
4. Trace: ITER ==> 6
3. Trace: ITER ==> 6
2. Trace: ITER ==> 6
1. Trace: ITER ==> 6
6
De toute façon la récursivité terminale apparaît clairement vu que tous les retours sont les mêmes, si cela n'était pas évident à l'examen du code:
(iter (* counter product) (+ counter 1) n)
Merci en tout cas pour ces aimables réponses et à bientôt sur les forums :-)
Partager