Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Lisp递归混淆_Recursion_Lisp_Common Lisp_Tail Recursion - Fatal编程技术网

Recursion Lisp递归混淆

Recursion Lisp递归混淆,recursion,lisp,common-lisp,tail-recursion,Recursion,Lisp,Common Lisp,Tail Recursion,我相信这是独立于实现的,但我在debian上使用了clisp。 下面我定义了两个名为SUM的函数。他们通过将1与N2相加,然后从N1中减去1,直到N1为0,从而求出两个非负整数之和。方法1对我来说是有意义的,但方法2是混乱的根源 ;;;Approach #1 (I understand why it works) > (defun sum (n1 n2) "Return the sum of two nonnegative integers." (if (zerop n1) n

我相信这是独立于实现的,但我在debian上使用了clisp。 下面我定义了两个名为
SUM
的函数。他们通过将1与N2相加,然后从N1中减去1,直到N1为0,从而求出两个非负整数之和。方法1对我来说是有意义的,但方法2是混乱的根源

;;;Approach #1 (I understand why it works)
> (defun sum (n1 n2) "Return the sum of two nonnegative integers."
      (if (zerop n1) n2 (sum (1- n1) (1+ n2)))) ;1+ adds 1 to it's operator
> (sum 5 10)
1. Trace: (SUM '5 '10)
2. Trace: (SUM '4 '11)
3. Trace: (SUM '3 '12)
4. Trace: (SUM '2 '13)
5. Trace: (SUM '1 '14)
6. Trace: (SUM '0 '15)
6. Trace: SUM ==> 15
5. Trace: SUM ==> 15
4. Trace: SUM ==> 15
3. Trace: SUM ==> 15
2. Trace: SUM ==> 15
1. Trace: SUM ==> 15
15 ;;;The result
使用另一种方法可以发现同样的结果,我不理解,但似乎更常见:

> (defun sum (n1 n2) "Return the sum of two nonnegative numbers."
    (if (zerop n1) n2 (1+ (sum2 (1- n1) n2))))
> (sum 5 10)
1. Trace: (SUM '5 '10)
2. Trace: (SUM '4 '10)
3. Trace: (SUM '3 '10)
4. Trace: (SUM '2 '10)
5. Trace: (SUM '1 '10)
6. Trace: (SUM '0 '10)
6. Trace: SUM ==> 10
5. Trace: SUM ==> 11
4. Trace: SUM ==> 12
3. Trace: SUM ==> 13
2. Trace: SUM ==> 14
1. Trace: SUM ==> 15
15
可以清楚地看到,这些方法确实有很大的不同,并且得到了相同的结果。lisp如何允许第二种方法中的行为,以及在第二种方法中,函数
+1
通过向函数添加1作用于什么,因为函数不是变量?
我从sum2的第15章中得到了这两个函数,这两个函数没有什么不同。两者都从
n1
中取1;第一个
sum
将其移动到
n2
,而第二个将其添加到递归调用的结果中


第一个
和的好处在于它是尾部递归的:它只返回递归调用的结果,可以更有效地实现(并且更接近于循环的模型)。

我认为我最好在编辑中说明这个问题,以考虑我正在寻找的答案类型,请看一下我修改过的最后几句话。它如何准确地对递归调用执行1+。“1+”,顾名思义,比它的参数多返回1;在本例中,我们将向递归调用返回的结果添加1。(我假设“sum2”是一个打字错误。)我现在明白了,上面的评论解释了我需要的。谢谢^