繁体   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