gpt4 book ai didi

lisp - 我不知道这个功能应该做什么

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:44 25 4
gpt4 key购买 nike

我这里有一个函数需要修改,这样我就可以避免 (f (car l)) 的双重递归调用。首先我无法弄清楚它显示的是什么..如果我通过 (f '((3 4) 5 6)) 它会显示 CAR: 3 is not a list谁能帮我理解然后修改?

(DEFUN F (L)
(COND
((NULL L) 0)
((> (f (car l)) 2) (+ (car l) (f (cdr l))))
(T (f (CAR L)))
))

最佳答案

您可以通过查看函数对输入执行的操作来确定该函数应该接受什么作为输入,以及通过查看每种情况返回的内容来确定它应该返回什么。分三种情况:

案例一

((NULL L) 0)

在这种情况下,L可以是nil,返回一个数字0

案例2

((> (f (car l)) 2) (+ (car l) (f (cdr l))))

在这种情况下,我们在 l 上调用了 carcdr,所以 l 最好是一个缺点。我们还将 (f (car l))2 进行比较,因此 f 必须返回一个数字,至少对于任何类型 ( car l) 是。因为我们用 (car l) 调用 +,所以 (car l) 必须是一个数字。所以 f 必须在给定一个数字时返回一个数字。现在,我们还用 (f (cdr l)) 调用 +,所以无论 (cdr l) 有什么类型, f 最好也为它返回一个数字。

案例三

(T (f (CAR L)))

这并没有给我们带来太多限制。这只是说如果我们没有前两种情况中的任何一种,那么我们返回 (f (car l))。由于检查第二种情况没有失败,并且因为我们正在调用 (car l),所以 l 仍然必须是 cons这种情况。

那么f是什么?

嗯,目前还不是很清楚 f 是什么,但我们可以将它写成一个分段函数,也许这会有所帮助。它采用一个列表,该列表可以是空列表,也可以是具有第一个和一个其余部分的 cons。

f []   = 0
f x:xs = if (f x) > 2
then x + (f xs)
else (f x)

要修改它以便您只调用 (f (car l)) 很容易,尽管因为我们知道输入需要是一个列表,所以我将使用 firstrest 来建议,而不是 carcdr

(defun f (list)
(if (endp list)
0
(let ((tmp (f (first list))))
(if (> tmp 2)
(+ (first list)
(f (rest list)))
tmp))))

让我们尝试遍历一些可能的输入并尝试涵盖不同的代码分支。我们可以用什么样的输入来调用它?好吧,我们可以用 () 调用它:

CL-USER> (f '())
0

这会处理第一个 then 分支。现在如果我们想打第二个怎么办?然后我们需要传递一些不是空列表的东西,所以它看起来像 (? . ??)。现在要做的第一件事是递归调用(f (first list))。唯一可行的方法是 if(first list) 也是我们可以传递给 f 并取回值的列表。 Then(first list)` 必须是空列表或另一个合适的列表。所以我们可以调用:

CL-USER> (f '(() a b c))
0

一般来说,我们可以用 () 和任何 list 调用 f 使得 (first (first (first . .. (first list))))()。我们可以用别的东西来调用它吗?看起来不是这样。所以现在我们知道 f 可接受的输入是什么:

input ::= ()
| (input . anything)

并且输出将始终为 0

关于lisp - 我不知道这个功能应该做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com