解释一下我的LISP代码

时间:2016-07-20 13:44:39

标签: lisp

我是LISP的新手,我正在努力理解递归。

我所知道的是递归需要一个STOP条件。在下面的代码中,您能解释一下为什么(equal x 0) 1是我的停止状态因为fact(- X 1)可以无限期地继续,因为在我的第二个条件下,我已经设置为t我的第二行{ {1}}这意味着它应该继续。

但是当我运行该程序时,它工作正常。下面是我的代码(偶然发现)

cond

1 个答案:

答案 0 :(得分:0)

cond表达有许多条款。每个子句的格式为(expr1 expr2)。如果expr1评估为true,则expr2 is evaluated and that is the returned value of the cond`。没有评估其他条款。

因此,一旦x变为0cond的第一个条款的评估结果为真,而对fact的调用将返回1

cond的另一个子句的第一个表达式为t,根据定义是正确的;因此,如果不使用第一个子句,它总是使用第二个子句。 (带有cond的{​​{1}}子句就像"否则"在其他languga中的" if"语句中。)

这个函数是递归的,如果用参数2调用它,它会检查2 == 0,它不会这样,那么它将2与递归调用自身返回的值相乘1.从1开始!= 0它将返回1的值乘以递归调用自身的值为0.由于0等于0,它只返回1,使用一层返回1,然后在此递归的顶层使用返回2.

Common Lisp有一个函数trace,它可以让你看到函数的调用时间和参数。通常,每个递归调用都将缩进,因此您可以看到如下内容:

t

这有助于理解这个功能。

(正如评论中所提到的 - 这个函数没有捕获负输入的情况 - 但这是错误处理,可以很容易地修复)。