2014-02-26 38 views
1

对于我的课,我需要编写一个函数,接受一个字符串,并在字符串中找到每个辅音后添加“op”。我正在做一些计划作业,涉及递归函数,我很困惑

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

(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”函数,但是我对递归函数很不好。

如果有人可以帮帮忙,并指出我在正确的方向或某个网络,可以帮助这将是梦幻般的

回答

1

所以你的初始过程检查一个字符是一个元音上。该参数是一个char,不需要在这里检查null。此外,它是一个谓词(返回true或false),所以我们称之为vowel?

(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 '()))))))` 

和递归性意味着

  1. 您处理的第一个元素(由car获得),并呼吁列表的其余部分相同的步骤(直到你达到你的基本情况(这里由cdr获得)
  2. ,列表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!" 
1

这里是一个尾递归解决方案(你的老师一定会给你额外信贷使用尾递归!):

(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-"