簡體   English   中英

Racket 中的遞歸/列表

[英]Recursion/Lists in Racket

我正在嘗試創建函數remove-member ,其中我有一個字符串列表,我將字符串的成員之一(即"A" )提供給函數,它會刪除該成員並返回列表的其余部分沒有那個成員。 目前我已經創建了測試並開始了我的功能,但我已經迷失了。 我知道遞歸函數包括列表的第一個成員和它的其余部分,但我將如何刪除字符串的第一個成員?

(define str (list->string (list 'A 'B 'C)))

(check-expect (remove-occurrences "A") (list 'B 'C))
(check-expect (remvove-occurrences '()) (list 'A 'B 'C))

(define (remove-occurrences r)
  (cond
    [(empty? r) str]
    [(??? r)]))

要從列表中刪除單個元素:

  1. 列表是空的嗎? 如果是,我們就完成了,結果是空列表。
  2. 好的,它不是空的。 列表的第一個元素是否與您要刪除的元素相同? 如果是,則結果是列表的其余部分。
  3. 好的,它不為空,並且第一個元素不匹配。 所以答案是一個列表,由第一個元素的 cons 和從列表的其余部分中刪除元素的結果組成。 你現在知道該怎么做了。

或者,要從列表中刪除所有出現的元素:

  1. 列表是空的嗎? 如果是,我們就完成了,結果是空列表。
  2. 好的,它不是空的。 列表的第一個元素是否與您要刪除的元素相同? 如果是,那么結果就是從列表的其余部分中刪除所有出現的元素的結果,您現在知道該怎么做。
  3. 好的,它不為空,並且第一個元素不匹配。 所以答案是一個列表,由第一個元素的 cons 和從列表的其余部分中刪除元素的結果組成。 你現在知道該怎么做了。

這些功能有何不同:

> (remove-one '(a b b c) 'b)
'(a b c)
> (remove-all '(a b b c) 'b)
'(a c)

讓我們按照數據類型。

通過這種方式,我們可以自動為我們處理平凡的任務,並將我們的創造性思維能力集中在我們問題中更有趣、更不常見的方面:

(define (list-p ad)
  (cond
    ((null? ad)       ; follow
      #t)
    ((pair? ad)
      (let ((a (car ad))  ; the
            (d (cdr ad))) ; type! 
        (list-p d)))
    (else #f)))

我們可以將此謂詞視為布爾值的構造函數。 按照相同的示例(即骨架代碼)創建列表也很容易:

(define (list-l ad)
  (cond
    ((null? ad)  ; return proper
      (list))    ; type here, and
    ((pair? ad)
      (let ((a (car ad))
            (d (cdr ad))) 
        (list-l d)))   ; here
    (else #f)))

我們剛剛遵循了該類型的骨架代碼,在幾個適當的地方對其進行了修改,並得到了一個可以自己創建正確類型值的工作代碼!

但它是否創造了任何有趣的價值,完全使用提供的參數? 顯然,不是。 為此,我們必須修改遞歸調用:

(define (list-copy ad)
  (cond
    ((null? ad)  
      (list))    
    ((pair? ad)
      (let ((a (car ad))
            (d (cdr ad))) 
        (cons ...         ; here
              (list-copy d))
           ))
    (else #f)))

現在您可以進一步調整它,根據您的問題要求有條件地使用 pair 的第一個元素。

(注意: null?在你的方言中可以稱為empty? )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM