Это действительно странно случай использования, чтобы сделать такое дополнение, но Я объясню вам, где ваши ошибки:
(defun sum (n m)
;;;Returns the sum of n and m using recursion
(cond ((eq m 0) n)) ;; <= This line is ignored, you not returnin N.
(sum (1+ n) (1- m))) ;; <= this will be called forever
Вы должны написать:
(defun sum (n m)
"Recursively increment N and decrement M untill M = 0"
(if (= m 0) ;; don't use EQ for numbers, use EQL or =.
n
(sum (1+ n) (1- m)))) ;; Otherwise recursive call
Давайте проследим его, чтобы увидеть, как это работает:
CL-USER> (sum 0 10)
0: (SUM 0 10)
1: (SUM 1 9)
2: (SUM 2 8)
3: (SUM 3 7)
4: (SUM 4 6)
5: (SUM 5 5)
6: (SUM 6 4)
7: (SUM 7 3)
8: (SUM 8 2)
9: (SUM 9 1)
10: (SUM 10 0)
10: SUM returned 10
9: SUM returned 10
8: SUM returned 10
7: SUM returned 10
6: SUM returned 10
5: SUM returned 10
4: SUM returned 10
3: SUM returned 10
2: SUM returned 10
1: SUM returned 10
0: SUM returned 10
10
Если вы возьмете совет - не пытайтесь делать такие странные вещи, с помощью рекурсии, если вы хотите leard, как использовать его, попробуйте его некоторые естественно-рекурсивные случаи, такие как факториалы, фибоначчи, обработка дерева и тому подобное.
Вы называете 'SUM' рекурсивно. Он останавливается, когда стек переполняется. Может быть, вы должны улучшить условие, чтобы остановить его само по себе ... Попробуйте использовать 'IF'. Также 'EQ' не для чисел. Используйте 'EQL' или' = '. –
Отступ правилен в соответствии с кодом. 'cond' делает то, что выбрасывается (' n' или 'nil'), затем безусловная рекурсия, добавляя' n' и уменьшая 'm'. Он не вернет 'nil', так как он не остановится. Вы действительно получаете сообщение о переполнении стека? – Sylwester
@Sylwester Да, я получаю сообщение переполнения стека в Emacs. Изучение того, что другие меня исправили, показали мне, как я на самом деле перепутался с моим заявлением cond и почему рекурсия никогда не заканчивается. – BurnedOut