我正在嘗試為峰值撰寫一個函式,該函式消耗串列以生成一個包含原始串列所有峰值的子串列。前任。(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))]))```
uj5u.com熱心網友回復:
一個可能的解決方案是:
(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)
uj5u.com熱心網友回復:
我可能會像這樣接近它。首先,我撰寫了一個函式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讓我們在找到峰值后快進一個元素。這是因為一個峰永遠不可能與另一個峰相鄰——
| 一種 | 乙 | C | …… |
|---|---|---|---|
| 1 | 2(峰值) | 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(峰值) | 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(峰值) | 4 |
現在我們將考慮一些其他輸入peaks-
(peaks (list 1 2 3 2 1))
(peaks (list 3 2 1 2 3))
(peaks null)
'(3)
'()
'()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328817.html
下一篇:異步發布父子物件和關系(遞回?)
