更改字符串中的某些字母

时间:2011-03-04 22:15:53

标签: string recursion scheme

编辑:

(define leet-helper
  (lambda (string)
    (cond
      [(null? (string->list string)) ""]
      [(equal? (car string)#\e)
       (cons 3 (leet-speak (cdr string)))]
      [(equal?  (car string) #\s)
       (cons 5 (leet-speak (cdr string)))]
      [(equal? (car string) #\o)
       (cons 0 (leet-speak (cdr string)))]
      [else string])))

(define leet-speak
  (lambda (string)
    (list->string (string->list (leet-speak string)))))

我正在处理一个问题,它接受一个字符串并返回相同的字符串,所有的e变为3,所有s变为5,所有o变为0。我发布了迄今为止我创建的内容,但是当我尝试测试时我一直都会遇到错误,所以我知道我做的不对。此外..此代码有3个单独的条件,但如果给出的字符串是“eso”,我希望更改所有3个字符,而不仅仅是'e'。我不知道该怎么做,或者我的递归会自己处理[?]。任何指针将不胜感激!

(define leet-speak
  (lambda (string)
    (cond
      [(null? (string->list string)) ""]
      [(equal? (car (string->list string)) 'e) 
       (list->string (cons 3 (leet-speak (cdr (string->list string)))))]
      [(equal? (string->list (car string)) 's)
       (list->string (cons 5 (leet-speak (cdr (string->list string)))))]
      [(equal? (string->list (car string)) 'o)
       (list->string (cons 0 (leet-speak (cdr (string->list string)))))])))

1 个答案:

答案 0 :(得分:1)

现在假设我们使用字符串“test”测试您的程序(通过手动步进)。我们看到的第一个错误是您没有else个案例。其次,您会注意到,当您将(car (string->list string))'e进行比较时,您将始终得到错误,因为当字符串被分解时,它会被分解为字符(#\e)而不是符号。

我建议你在测试你的代码时,记下你一直在犯的错误(你的问题是什么类型的错误?你的问题中没有提到它们;方案通常对其错误信息很有帮助)并尝试修复每一个。例如,如果你得到

string->list : expects argument of type <string>; given myinput

然后您知道您提供myinput的{​​{1}}类型有问题。您的代码中会出现这种类型的错误。当我遇到递归输入类型问题时,我喜欢使用的一种方法是使用辅助函数/包装函数(提示)。

此外,测试递归程序的一种好方法是手动运行它们(例如,使用字符串“test”,如开头所述),然后查看卡住的位置并相应地修复程序。

我希望这会帮助您找到正确的方向,如果您需要更多指示,请告诉我。