如何确定一个数字是不是是列表中的最大元素 - 使用 Racket
Posted
技术标签:
【中文标题】如何确定一个数字是不是是列表中的最大元素 - 使用 Racket【英文标题】:How to determine if a number is the largest element in a list - Using Racket如何确定一个数字是否是列表中的最大元素 - 使用 Racket 【发布时间】:2021-12-01 15:23:28 【问题描述】:我正在尝试为峰值编写一个函数,该函数使用列表来生成一个包含原始列表的所有峰值的子列表。前任。 (peaks (cons 1 (cons 6 (cons 4 (cons 5 empty))))) 应该产生 (cons 6 (cons 5 empty))
我的答案似乎是正确的,但我认为我在某个地方搞砸了,因为它不是正确的答案。我使用递归做了一个辅助函数来确定列表中的最大数量,然后将其子代入另一个递归函数以创建一个包含最大数量的子列表。
关于我在哪里搞砸的任何建议?我们刚刚开始学习递归,这是唯一让我感到困惑的问题。
(cond
[(empty? (rest lon)) (first lon)]
[else (max (first lon) (greatest (rest lon)))]))
(define (peaks lon)
(cond
[(empty? (rest lon)) lon]
[(equal? (first lon) (greatest lon)) (cons (first lon) (peaks (rest lon)))]
[else (peaks (rest lon))]))```
【问题讨论】:
这需要递归吗?您要做的就是为每个元素保存它,如果它大于它之前的数字,并且大于它之后的数字。您可能需要递归来迭代列表,我不记得球拍是否允许您在没有递归的情况下迭代列表。您的基本案例应该处理第一个和最后一个元素,第一个元素只需要大于它之后的元素,最后一个数字也需要这样做。还有水水水 @SatbirKira 列表是一种递归数据结构,因此处理它的递归过程是最自然的解决方案。 【参考方案1】:一个可能的解决方案是:
(define (peaks lst)
(cond [(empty? lst) lst]
[(empty? (rest lst)) lst]
[(empty? (rest (rest lst))) (list (max (first lst) (second lst)))]
[(<= (first lst) (second lst)) (peaks (rest lst))]
[else (cons (first lst) (peaks (rest (rest lst))))]))
例子:
> (peaks '(1 6 4 5))
'(6 5)
> (peaks '(9 1 2 6 7 3 4 5 0 8))
'(9 7 5 8)
> (peaks '())
'()
> (peaks '(7))
'(7)
> (peaks '(7 3))
'(7)
> (peaks '(3 4))
'(4)
> (peaks '(5 0 8))
'(5 8)
> (peaks '(6 7 3))
'(7)
【讨论】:
【参考方案2】:我可能会这样处理它。首先,我编写了一个函数is-peak
,它确定三 (3) 个相邻元素是否在中间元素中包含一个峰值 -
(define (is-peak a b c)
(and (< a b) (> b c)))
然后我编写了一个peaks
过程,对包含元素 0、1、2、3 或更多元素的列表使用模式匹配 -
(define (peaks ls)
(match ls
;; 0, 1, or 2-element lists do not have peaks
[(list) null]
[(list a) null]
[(list a b) null]
;; 3-element lists could have at most 1 peak
[(list a b c)
(if (is-peak a b c)
(list b)
null)]
;; 4 elements or more
[(list a b c d ...)
(if (is-peak a b c)
(cons b (peaks (cddr ls)))
(peaks (cdr ls)))]))
(peaks (list 1 2 1 3 4 5 4 2 1 5 6 7 4))
'(2 5 7)
我们可以可视化线性过程并跟踪a
、b
、c
、d ...
的值。请注意cddr
如何让我们在找到峰值后快进一个元素。这是因为一个峰永远不会与另一个峰相邻 -
a | b | c | d... |
---|---|---|---|
1 | 2 (peak) | 1 | 3 4 5 4 2 1 5 6 7 4 |
1 | 3 | 4 | 5 4 2 1 5 6 7 4 |
3 | 4 | 5 | 4 2 1 5 6 7 4 |
4 | 5 (peak) | 4 | 2 1 5 6 7 4 |
4 | 2 | 1 | 5 6 7 4 |
2 | 1 | 5 | 6 7 4 |
1 | 5 | 6 | 7 4 |
5 | 6 | 7 | 4 |
6 | 7 (peak) | 4 |
现在我们将考虑peaks
的一些其他输入 -
(peaks (list 1 2 3 2 1))
(peaks (list 3 2 1 2 3))
(peaks null)
'(3)
'()
'()
【讨论】:
以上是关于如何确定一个数字是不是是列表中的最大元素 - 使用 Racket的主要内容,如果未能解决你的问题,请参考以下文章