gpt4 book ai didi

function - LISP 编写一个名为 cut-in-half 的函数,它接收一个列表并创建一个新列表,其元素是前半部分和后半部分

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

我在使用这个函数时遇到了问题。我们一开始被问到“写一个 lisp 函数,它接受一个列表和一个整数 n,并返回列表的前 n 个元素,作为一个新列表。如果 n 小于 1,它返回 NIL。如果 n 是超出长度,函数返回原始列表的副本。”

(defun take-n (list n)
(cond
((= n 0) ())
((null list) list)
((cons(car list)(take-n(cdr list)(- n 1)))))
)

到目前为止,我从上面的问题中得到的是:

(defun cut-in-half(list)
(let (x (ceiling(/ (length list) 2)))(let* (reverse list))
(list (take-n list x)(cdr(take-n y x))))
)

我做错了什么?

最佳答案

看看你是否可以围绕这个想法做功课:

[1]> (loop with l = '(1 2 3 4 5 6 7)
for x on l
for y = x then (cddr y)
when (null y)
return (values (ldiff l x) x))
(1 2 3 4) ;
(5 6 7)

[2]> (loop with l = '(1 2 3 4 5 6 7 8)
for x on l
for y = x then (cddr y)
when (null y)
return (values (ldiff l x) x))
(1 2 3 4) ;
(5 6 7 8)

这是我过去在实现二进制归并排序时所做的事情(用于将列表切成两半,递归地对两半进行排序,合并)。基本上我们有两个光标在列表中运行;双倍时间一步,以两倍的速度到达列表末尾(使用 cddr 步而不是 cdr ),这使另一个光标留在中间。

请注意,在 loop 中, for x on l语法与 for x = l then (cdr l) 大致相同,加上终止测试以在 x 时结束循环变为空。我们可以那样做,因为我们不需要对 x 进行终止测试.即

[9]> (loop with l = '(1 2 3 4 5 6 7 8)
for x = l then (cdr x)
for y = x then (cddr y)
when (null y)
return (values (ldiff l x) x))
(1 2 3 4) ;
(5 6 7 8)

x 以来,这很好和 y从句遵循相同的形式,cdr 之间的对比和 cddr是明确的。

要返回两个列表的列表,请使用 list而不是 values .由于 Common Lisp 具有多个值,因此惯用的做法是利用它而不是分配额外的列表单元格。

关于function - LISP 编写一个名为 cut-in-half 的函数,它接收一个列表并创建一个新列表,其元素是前半部分和后半部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512710/

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