【问题标题】: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 列表是一种递归数据结构,因此处理它的递归过程是最自然的解决方案。

标签: recursion functional-programming racket


【解决方案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)
    '()
    '()
    

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 2014-06-19
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      相关资源
      最近更新 更多