gpt4 book ai didi

scheme - 方案中的列表长度

转载 作者:行者123 更新时间:2023-12-02 07:11:15 25 4
gpt4 key购买 nike

嗨,我正在尝试编写一个程序,其中给定列表列表,检查它们的大小是否相等,如果相等则返回#t。

例如,如果我要编写 (list-counter? '((1 2 3) (4 5 6) (7 8 9))) 程序将返回 #t,并且 (list-counter? '( (1 2 3) (4 5 6) (7 8))) 将返回 #f。

到目前为止,这就是我所做的:

 (define list-counter?
(lambda (x)
(if (list? x)
(if (list?(car x))
(let (l (length (car x))))
(if (equal? l (length(car x))))
(list-counter?(cdr x))
) ) ) ) )

我认为我出错的地方是在我将 l 的长度设置为第一个列表的长度之后。任何帮助将不胜感激。

最佳答案

有多种方法可以解决这个问题。例如,手动并逐步进行:

(define (all-lengths lists)
(if (null? lists)
'()
(cons (length (car lists))
(all-lengths (cdr lists)))))

(define (all-equal? head lengths)
(if (null? lengths)
true
(and (= head (car lengths))
(all-equal? head (cdr lengths)))))

(define (list-counter? lists)
(let ((lengths (all-lengths lists)))
(all-equal? (car lengths) (cdr lengths))))

让我解释一下上面的过程。我将问题分为两步,首先创建一个包含每个子列表长度的新列表 - 这就是 all-lengths 所做的。然后,将列表中的第一个元素与其余元素进行比较,看看它们是否都相等 - 这就是 all-equal? 的作用。最后,list-counter? 将其全部包装在一起,使用正确的参数调用前面的两个过程。

或者通过使用列表过程(高阶过程)甚至更简单(更短):

(define (list-counter? lists)
(apply = (map length lists)))

为了理解第二种解决方案,请观察 all-lengthsall-equal? 代表更一般过程的特殊情况。当我们需要创建一个新列表并将过程应用于另一个列表的每个元素的结果时,我们使用map。当我们需要将过程(在本例中为 =)同时应用于列表的所有元素时,我们使用 apply。这正是 list-counter? 第二个版本正在做的事情。

关于scheme - 方案中的列表长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814751/

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