【发布时间】:2021-01-08 16:06:31
【问题描述】:
考虑以下 Lisp 中的函数定义:
(defun f (l)
(cond
((null l) 0)
((> (f (car l)) 2) (+ (car l) (f (cdr l))))
(T (f (car l)))
)
)
给出一个避免双重递归调用(f (car l))的解决方案。您不会使用 set、setq、setf。证明答案。
我是这样处理的:
(defun f2 (l)
(cond
((null l) 0)
((lambda (x)
(cond
((> x 2) (+ (car l) (f2 (cdr l))))
(T x)
)
) (f2 (car l))
)
)
)
我想听听一些意见。顺便说一句,这只是一个练习。这个函数不应该做一些连贯的事情。
【问题讨论】:
-
如果您更仔细地格式化您的代码,这将对包括您自己在内的所有人有所帮助。惯用的 Lisp 看起来与您所拥有的完全不同,这是有充分理由的。首先停止括号在多行上的分散;括号不是分号,Lisp 也不是 C。现在,当您尝试验证
f和f2具有相同的行为时,f2是否编译过? -
它不会编译,而是一个练习。我放了括号是为了看看事情从哪里开始和结束,我觉得它更具可读性。
-
"它不编译,而是一个练习。"练习是关于生成正确的代码,想一想,编译器可以帮助你做到这一点
-
@hackermanwasd --
f编译,但f2不编译:这暗示有问题,转换不成功。
标签: lambda lisp common-lisp