Recursion I';我正在做一些涉及递归函数和I';我很困惑

Recursion I';我正在做一些涉及递归函数和I';我很困惑,recursion,scheme,Recursion,Scheme,对于我的类,我需要编写一个接受字符串的函数,并在字符串中找到的每个辅音后添加“op” 到目前为止,我得到的是一个helper函数,它检查单个字母,看它是辅音还是元音。这是: (define (check-letter letter) (if (null? letter) 'empty (or (char=? letter #\a) (char=? letter #\e) (char=? letter #\i) (char=? letter #\o) (char=? let

对于我的类,我需要编写一个接受字符串的函数,并在字符串中找到的每个辅音后添加“op”

到目前为止,我得到的是一个helper函数,它检查单个字母,看它是辅音还是元音。这是:

(define (check-letter letter)

(if (null? letter)
  'empty

(or (char=? letter #\a) (char=? letter #\e)
    (char=? letter #\i) (char=? letter #\o)
    (char=? letter #\u) (char=? letter #\y))))
因此,这将给我一封信的正确或错误,但我不知道如何处理问题的其余部分

我知道我需要使用“string->list”函数,但我对递归函数非常不熟悉


如果有人能帮我指出正确的方向,或者在互联网上的某个地方,这将是非常棒的

,所以你的初始程序会检查字符是否是元音。该参数是一个字符,此处无需检查
null
。另外,它是一个谓词(返回true或false),所以我们称它为
元音?

(define (vowel? letter)
  (or (char=? letter #\a) (char=? letter #\e)
      (char=? letter #\i) (char=? letter #\o)
      (char=? letter #\u) (char=? letter #\y)))
将字符串转换为列表并返回的包装函数非常简单:

(define (add-op str op)
  (list->string
   (add-op-list (string->list str) op)))
现在是递归函数,处理列表。您知道列表的结构如下:

`(cons elt1 (cons elt2 (cons elt3 (cons elt4 (.... (cons '() ))))))`
递归性意味着

  • 处理第一个元素(通过
    car
    获得),并对列表的其余部分调用相同的过程(通过
    cdr
    获得)
  • 直到达到基本情况(此处,列表为
    null?
    ,因此添加最后的
    ”()
  • 因此,这导致:

    (define (add-op-list lst op)
      (if (null? lst) ; list is empty: finally add '()
          '()
          (let ((c (car lst))) ; c is the first element of the list
            (if (vowel? c)     ; is it a vowel?
                (cons c          (add-op-list (cdr lst) op)) ; yes, just add it to the resulting list and proces the rest
                (cons c (cons op (add-op-list (cdr lst) op))))))) ; no, add c and op
    
    尝试:

    > (add-op "Supercalifragilisticexpialidocious" #\!)
    "S!up!er!c!al!if!r!ag!il!is!t!ic!ex!p!ial!id!oc!ious!"
    

    下面是一个尾部递归解决方案(你的老师肯定会给你额外的学分,因为你使用了尾部递归!)

    (define (vowel? c)
      (member c '(#\a #\e #\i #\o #\u #\y)))
    
    (define (homework-1 string punc)
      (let extending ((letters (string->list string)) (result '()))
        (cond ((null? letters) 
               (list->string (reverse result)))
    
              ((vowel? (car letters))
               (extending (cdr letters)
                          (cons (car letters) result)))
    
              (else
               (extending (cdr letters)
                          (cons punc (cons (car letters) result))))
    
    > (homework-1 "abc" #\-)
    "ab-c-"