如何确定一个数字是不是是列表中的最大元素 - 使用 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)

我们可以可视化线性过程并跟踪abcd ... 的值。请注意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的主要内容,如果未能解决你的问题,请参考以下文章

列表List

python中列表(list)函数及使用

[Python列表]-索引

列表知识点整理

python中的列表list

Python3列表