Получение списка с максимальным значением из списка списков в Racket - PullRequest
1 голос
/ 24 февраля 2020

Учитывая список списков целых чисел, мне нужна эта программа в ракетке для отображения списка, который содержит наибольшее значение.

Например:

[[2000, 4 , 1000, 8], [2, 7, 810, 20], [19, 101, 4, 9]],

должно отображаться

[2000, 4, 100, 8]

, в результате с 2000 года это самое большое значение.

Однако следующая программа выдает ошибку:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '((28 14 32) (24 14 100))
  arguments...: [none]

И я не уверен почему. Может ли кто-нибудь помочь? Я совсем новичок в ракетке

#lang racket

(define (maxlist)
  (let loop((largest(cdr list))(m (car list)))
    (cond
      [(empty? list) m]
      [(> (car list) m) (loop (cdr list)(car list))]
      [else (loop (cdr list) m)])))

(define v1 (list (list 28 14 32) (list 24 14 100)))

maxlist(v1)

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020
#lang racket

;; write a function returning from two lists the list with the bigger element 
(define (greater-list l1 l2)
  (if (> (apply max l1) (apply max l2)) l1 l2))

;; apply this function throughout a lol (list of lists) 
;; - and it will return the max-list amongst the lists
(define (maxlist lol)
  (foldl greater-list '() lol))
1 голос
/ 24 февраля 2020

Случай пустого списка приводит к ошибке, если список имеет только один подсписок, то этот подсписок является максимальным подсписком. В противном случае, мы находим максимальный подсписок остальной части списка с помощью рекурсивного вызова и сравниваем элемент max в этом списке с элементом max в первом подсписке, на основе которого имеется больший элемент max, мы решаем если max-sub-list является первым подсписком или результатом рекурсивного вызова.

#lang racket

; (maxlist : (-> (Listof (Listof Number)) (Listof Number)))
; sublist that contains the largest number
(define (maxlist lolon)
  (cond [(empty? lolon) (error "'() does not have \"max\"-sublist")]
        [(empty? (rest lolon)) (first lolon)]
        [else
         (let ([max-rst (maxlist (rest lolon))])
           (if (> (apply max max-rst) (apply max (first lolon)))
               max-rst
               (first lolon)))]))

(maxlist '((2000 4 1000 8) (2 7 810 20) (19 101 4 9)))
; => '(2000 4 1000 8)
...