球拍功能递归

时间:2019-03-09 19:12:31

标签: racket

你好,我是一名学生,目前正在尝试在Dr型球拍中发挥作用,目的是 选择字母后,将其变成下划线

字符串(单词)字符串(字母)->字符串(答案/下划线)

我只能用一个字母_来实现这一点,这使得第二个检查为真,我不知道如何写多个字母

(check-expect(underscore "william""li")"_illi__")) 
(check-expect(underscore "william" "l")"__ll___))

我的代码:

(define (anti-omit word letter)
  (cond[(string=? word letter)letter]
    [(= 1 (string-length word))"_"]
     [else 
      (string-append 
(anti-omit (substring word 0 1)letter)
(anti-omit (substring word 1)letter))]))

1 个答案:

答案 0 :(得分:1)

这是一个存有目的声明,签名和您的测试的存根:

base64_encode()

由于您使用的是学生用语言,并且如您在问题标题中所建议的那样,您想对数据进行重现...您将需要递归数据定义

;; String String -> String
;; keeps all letters  that occur in l, replaces with "_" otherwise

(check-expect (anti-omit "william" "li") "_illi__")
(check-expect (anti-omit "william" "l") "__ll___")

(define (anti-omit w l)
  "")

完成此函数的定义:

;; String is one of:
;; - ""
;; - (string-append 1String String)

对其他两个功能(与列表的其余部分和第一个相对应)的数据限制更严格:

;; String -> String
;; is str equal to "" ?
(define (string-empty? str)
  ...)

您需要完成的其他一些功能:

;; NEString is one of:
;; - (string-append 1String "")
;; - (string-append 1String NEString)

现在,您可以在字符串上创建类似的函数了:

;; NEString -> String
;; remove the first 1String from str
(define (string-rest str)
  ...)

;; NEString -> String
;; the first 1String form str
(define (string-first str)
  ...)

类似地,完成以下定义:

;; [1String -> 1String] String -> String
;; Applies the function f on each 1String in s
(define (map-str f s)
  (cond  [(string-empty? s) ""]
         [else (string-append (f (string-first s)) (map-str f (string-rest s)))]))

我们的“愿望清单”已经完成,我们可以组成助手来完成最终功能:

;; 1String String -> Boolean
;; is does 1String occur in String?
(define (member-str e l)
  ...)

使用爆炸和内爆的类似版本,不需要我们定义的任何功能(将此用作参考实现):

(define (anti-omit w l)
  (map-str (λ (x) (if (member-str x l) x "_")) w))