如何确定一个数字是否是列表中最大的元素-使用Racket



我试图为峰值编写一个函数,该函数消耗列表以产生由原始列表的所有峰值组成的子列表。例(峰值(缺点1(缺点6)(缺点4(缺点5空))))))应产生(缺点6(缺点5空))

我的答案似乎是正确的,但我想我搞砸了,因为它不是正确的答案。我使用递归做了一个辅助函数来确定列表中的最大值,然后将其子归到另一个递归函数中,以创建由最大值组成的子列表。

有什么建议我搞砸了吗?我们刚开始学习递归,这是唯一一个让我困惑的问题。

(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))]))```


一个可能的解决方案是:

(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)

我可以这样处理它。首先,我写了一个函数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允许我们在找到峰值后快速前进一个元素。这是因为一个峰值不可能与另一个峰值相邻-

<表类>bcd…tbody><<tr>12(峰值)13 4 5 4 2 1 5 6 7 41345 4 2 1 5 6 7 43454 2 1 5 6 745(峰值)42 1 5 6 7 44215 6 7 42156 7 41567 4567467(峰值)4

相关内容

  • 没有找到相关文章

最新更新