我是LISP的新手,我正在努力理解递归。
我所知道的是递归需要一个STOP条件。在下面的代码中,您能解释一下为什么(equal x 0) 1
是我的停止状态因为fact(- X 1)
可以无限期地继续,因为在我的第二个条件下,我已经设置为t
我的第二行{ {1}}这意味着它应该继续。
但是当我运行该程序时,它工作正常。下面是我的代码(偶然发现)
cond
答案 0 :(得分:0)
cond
表达有许多条款。每个子句的格式为(expr1 expr2)
。如果expr1
评估为true,则expr2 is evaluated and that is the returned value of the
cond`。没有评估其他条款。
因此,一旦x
变为0
,cond
的第一个条款的评估结果为真,而对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
这有助于理解这个功能。
(正如评论中所提到的 - 这个函数没有捕获负输入的情况 - 但这是错误处理,可以很容易地修复)。