Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在列表列表中查找最长的子列表(球拍/方案)_List_Racket - Fatal编程技术网

List 在列表列表中查找最长的子列表(球拍/方案)

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

我编写这个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”是((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还解决了我代码中的另一个问题,它终于起作用了。