我正在做一些涉及递归函数的计划作业,我很困惑

时间:2014-02-26 03:29:49

标签: recursion scheme

对于我的班级,我需要编写一个接受字符串的函数,并在字符串中找到的每个辅音后添加“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”函数,但我对递归函数非常不满。

如果有人可以提供帮助并指出我在正确的方向或互联网上的某个地方可能会有所帮助那将是非常棒的

2 个答案:

答案 0 :(得分:1)

因此,您的初始程序会检查char是否为元音。参数是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?,因此请添加最终'()
  3. 所以这导致:

    (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 :(得分: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-"