给我解释一下我的LISP代码

给我解释一下我的LISP代码,lisp,Lisp,我是LISP新手,我正在努力理解递归 我知道递归需要一个停止条件。在我下面的代码中,你能解释一下为什么相等的x01是我的停止条件吗?因为事实-x1可以无限期地继续,就像在我的第二个条件中一样,我已经将cond的第二行设置为t,这意味着它应该继续 但是当我运行这个程序时,它运行得很好。下面是我偶然发现的代码 (defun fact(x) (cond ((equal x 0) 1) (t (*(fact(- x 1)) x)) ) ) cond表达

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

我知道递归需要一个停止条件。在我下面的代码中,你能解释一下为什么相等的x01是我的停止条件吗?因为事实-x1可以无限期地继续,就像在我的第二个条件中一样,我已经将cond的第二行设置为t,这意味着它应该继续

但是当我运行这个程序时,它运行得很好。下面是我偶然发现的代码

(defun fact(x)
    (cond
        ((equal x 0) 1)
        (t (*(fact(- x 1)) x)) 
    )
)
cond表达式有许多子句。各条款的格式为expr1 expr2。如果expr1的计算结果为true,则会计算expr2,这是命令“”的返回值。不评估其他条款

因此,一旦x变为0,cond的第一个子句计算为true,对fact的调用返回1

cond的另一个子句具有t的第一个表达式,其定义为true;因此,如果不使用第一个子句,它总是使用第二个子句。带有t的cond子句与其他语言的if语句中的else类似

这个函数是递归的,如果你用参数2调用它,它会检查2==0,如果不是,那么它会用2乘以递归调用自身返回的值1。从1开始它将返回1的值乘以用0递归调用自身的值。因为0等于0,所以它只返回1,使用1层返回1,然后在递归的顶层使用1返回2

Common Lisp有一个函数,它可以让您查看何时调用函数以及使用什么参数。通常,每个递归调用都会缩进,因此您可以看到如下内容:

(fact 2)
    (fact 1)
       (fact 0)
这有助于理解此函数


如注释中所述-此函数不捕捉负输入的情况-但这是错误处理,可以很容易地修复。

如果传递负数,我可以无限期地继续。结果或替代结果是if的值,最后一个表达式是返回值。在JS中,它类似于:函数factx{returnx==0?1:x*factx-1;}