DrRacket - 查找集合中的最大数字

时间:2017-06-25 19:58:22

标签: racket

prune

我希望能够找到一组值中的最大数字,对于此问题包含来自(for judges ([judge1 judge2 judge3 judge4 judge5 judge6 judge7 judge8]) (define i 0) (define j 1) (cond [(< judges[i] judges[j]) (cond [(equal? judges[j] judges(length)) (define highest-score judges[j])] [else (judges[i] judges[j]) (judges[j] judges[j +1])])] [else (cond [(equal? judges[i] judges[length -1]) (define highest-score judges[i])] [else (judges[j] judges[j +1])])])) 的值。我试图解决这个问题的方法是将前两个数字放在一个列表上并进行比较;我似乎无法在DrRacket上找到关于我想要执行的操作类型的正确语法的文档。

2 个答案:

答案 0 :(得分:0)

找到最大元素的一种简单方法(在编写代码方面)是对列表进行排序,并获取该列表的最后一个元素。正如@ pdoherty926所提到的,在Racket中对列表进行排序的最简单方法是使用sort函数。你只要给它一个列表和一个比较器,它就会为你排序:

> (sort '(5 2 6 1) <)
'(1 2 5 6)

因为你希望max值只是抓住最后一个元素:

> (last (sort '(5 2 6 1) <))
6

虽然如果要查找其他(非列表)数据结构的最大值,for是一个很有吸引力的选择。虽然您的算法看起来不错,但您的语法已关闭。在这种特殊情况下,我实际上建议使用for/fold。基本上,它允许你有一个累加器,它将保持你到目前为止的最高判断,以及你正在迭代的裁判列表,以及你想如何修改累加器的正文。在这种情况下,您的循环将类似于:

;; A judge is a non-negative number
(define judges '(5 6 1 2))
(for/fold ([largest -1])
          ([j (in-list judges)])
  ...)

...替换为largest的下一个值。整个循环计算为largest的最终值。

这里有趣的是j是一个实际的判断,而不仅仅是judges列表的索引。所以你的身体需要完全引用judges列表。它应该看起来像:

(max j largest)

因为法官只是一个数字。我会让你把身体放在循环中作为练习。

顺便说一句,由于评委只是数字,您可以直接使用max apply

> (apply max '(5 6 1 2))
6

作为另外一个注释,如果由于某种原因你确实需要你正在检查的当前判断的实际索引,你可以使用in-naturals

(for/fold ([largest -1])
          ([j (in-list judges)]
           [index (in-naturals)])
  ...)

答案 1 :(得分:0)

以下递归函数也可用于查找列表中的最大数字:

(define (largestnum slist)
  (cond
    ((= (length slist) 2)      ; if only 2 numbers, compare them
     (if (> (car slist) (list-ref slist 1))
         (car slist)
         (list-ref slist 1)))
    (else                      ; else recurse to compare car with largest of cdr
     (let ((cdrLargest (largestnum (cdr slist))))
       (if (> (car slist) cdrLargest)
           (car slist)
           cdrLargest)))))


(define judges '(5 6 1 2))
(largestnum judges)

输出:

6