gpt4 book ai didi

list - 在列表列表中找到最长的子列表( Racket /方案)

转载 作者:行者123 更新时间:2023-12-01 12:40:33 26 4
gpt4 key购买 nike

我编写了这个Racket代码,以查找并显示列表列表中最长的子列表,但是如果多个子列表的长度相等且都是最长的,我希望它返回最后一个具有最长长度的子列表。

(define longest '())
;returns longest sublist in a list of lists
(define (longestSub losl)
(set! longest (car losl))
(for ([x (- (length losl) 1)])
(if (>= (length (list-ref losl x)) (length longest))
(set! longest (list-ref losl x))
(void losl)))
(display longest))

例如,如果“losl”为((1 2)(3 4 5)(6 7 8)),我希望它返回(6 7 8),但现在它会返回(3 4 5)。谁能告诉我我在做什么错?

最佳答案

谁能告诉我我在做什么错?

使用(for ([x (- (length losl) 1)]) ;...,循环不会迭代到输入列表的末尾。对于给定的输入,(length losl)为3;因此loop子句等效于(for ([x 2]) ;...,类似于(for ([x (in-range 2)]) ;...。这将为x生成值0和1,但从未达到2,因此从不检查最后一个列表。若要更正此问题,请更改为:

(define (longestSub losl)
(set! longest (car losl))
(for ([x (length losl)])
(if (>= (length (list-ref losl x)) (length longest))
(set! longest (list-ref losl x))
(void losl)))
(display longest))

顺便说一句,您可以使用 (void losl)而不是 when摆脱 if:
(define (longestSub losl)
(set! longest (car losl))
(for ([x (length losl)])
(when (>= (length (list-ref losl x)) (length longest))
(set! longest (list-ref losl x))))
(display longest))

为此使用循环和 set!可能不是最惯用的解决方案。另一种方法是使用递归,以及一个传递当前最长子列表的辅助函数:
(define (longest-sublist losl)
(define (lsl-helper losl longest)
(cond [(empty? losl)
longest]
[(>= (length (first losl)) (length longest))
(lsl-helper (rest losl) (first losl))]
[else (lsl-helper (rest losl) longest)]))
(lsl-helper losl '()))

两种解决方案都可以,但是有一些区别。如果输入列表为空,则OP解决方案将因运行时错误而失败: (longestSub '())。但是,此递归解决方案将为相同的输入返回空列表,而不是失败。首选哪种行为取决于OP。另一个区别是,此递归解决方案返回最长的子列表,而OP解决方案仅打印它。

关于list - 在列表列表中找到最长的子列表( Racket /方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61051302/

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