gpt4 book ai didi

clojure - 为什么这个递归函数将一个空集合传递给 `take` ?

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

我正在尝试在 Scheme 中编写 Clojure 的 partition-all 函数的实现:

(define (take lst n)
(if (= n 0)
'()
(cons (car lst) (take (cdr lst) (- n 1)))))

(define (partition-all n step coll)
(if (not (null? coll))
(cons (take coll (min n (length coll)))
(partition-all n step (list-tail coll step)))))

但是口译员对我大吼:

cdr: expected pair in argument #1

这意味着,在某个时候,一个空列表 '() 被传递给 take 由于条件 (not ( null?coll))partition-all 函数中。

我的函数有什么问题?

最佳答案

根据我在评论中所说的内容,我非常确定不是 take 中的cdr 给您带来了问题。在 ideone 上运行你的代码给我:

ERROR: In procedure list-tail:

ERROR: In procedure list-tail: Wrong type argument in position 1 (expecting pair): ()

因此,问题是您试图获取一个不够长的列表的尾部。这可以通过仅采用最小的 step 和集合长度来缓解:

(define (take lst n)
(if (= n 0)
'()
(cons (car lst) (take (cdr lst) (- n 1)))))

(define (partition-all n step coll)
(if (not (null? coll))
(cons (take coll (min n (length coll)))
(partition-all n step (list-tail coll (min (length coll) step))))
;;^^^^^^^^^^^^^^^^^
'()
;;^^^
))


(display (partition-all 3 2 '(a b c d e f g)))
; => ((a b c) (c d e) (e f g) (g))

( Live on ideone )

请注意,我还在 if 中添加了一个 else 案例,否则结果列表不是以 '()(空列表)结束,而是以一个未指定的结束值(value)。

另请注意,您的两个函数都不是尾递归的。

关于clojure - 为什么这个递归函数将一个空集合传递给 `take` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36683515/

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