【问题标题】:Finding the longest sub-list in list of lists (Racket/Scheme)在列表列表中查找最长的子列表(Racket/Scheme)
【发布时间】:2020-07-17 22:47:28
【问题描述】:

我编写了这个 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) .谁能告诉我我做错了什么?

【问题讨论】:

    标签: list racket


    【解决方案1】:

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

    使用(for ([x (- (length losl) 1)]) ;...,循环不会迭代到输入列表的末尾。对于给定的输入,(length losl) 为 3;所以循环子句等价于(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))
    

    顺便说一句,您可以通过使用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 '()))
    

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

    【讨论】:

    • 非常感谢!范围问题也解决了我的代码的另一个问题,它终于可以工作了。
    【解决方案2】:

    我们踢掉较小的元素或左边的元素。

    (define (longest  lst)
      (foldr (λ (a b) (if (> (length a) (length b)) a b))
             '()
             lst))
    
    ;;; TEST
    (longest '((1 2) (3 4 5) (6 7 8)))
    

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多