List 在列表列表中查找最长的子列表(球拍/方案)
我编写这个Racket代码是为了在列表中查找并显示最长的子列表,但是如果多个子列表的长度相等且都最长,我希望它返回最后一个长度最长的子列表List 在列表列表中查找最长的子列表(球拍/方案),list,racket,List,Racket,我编写这个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 (lis
(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”是((12)(345)(678)),我希望它返回(678),但现在它将返回(345)。谁能告诉我我做错了什么
谁能告诉我我做错了什么
使用(for([x(-(length losl)1)];…
循环不会迭代到输入列表的末尾。对于给定的输入,(length losl)
是3;因此循环子句相当于(for([x 2]);…
,这类似于(for([x(范围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))
顺便说一句,您可以使用when
而不是if
来摆脱(void losl)
:
(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解决方案仅打印它。我们剔除较小的元素或左侧元素
(define (longest lst)
(foldr (λ (a b) (if (> (length a) (length b)) a b))
'()
lst))
;;; TEST
(longest '((1 2) (3 4 5) (6 7 8)))
非常感谢!range还解决了我代码中的另一个问题,它终于起作用了。