String 更改字符串中的某些字母

String 更改字符串中的某些字母,string,recursion,scheme,String,Recursion,Scheme,编辑: 我正在处理一个问题,它接受一个字符串并返回相同的字符串,所有的e都变成了3,所有的s都变成了5,所有的o都变成了0。到目前为止,我已经发布了我创建的内容,但是当我尝试测试这个时,我不断地出现错误,所以我知道我没有做正确的事情。也。。这段代码有3个独立的条件,但如果给定的字符串是“eso”,我希望所有3个字符都被更改,而不仅仅是“e”。我不确定如何做到这一点,或者我的递归是否会自行解决这个问题[?]。任何提示都将不胜感激 (define leet-helper (lambda (str

编辑:

我正在处理一个问题,它接受一个字符串并返回相同的字符串,所有的e都变成了3,所有的s都变成了5,所有的o都变成了0。到目前为止,我已经发布了我创建的内容,但是当我尝试测试这个时,我不断地出现错误,所以我知道我没有做正确的事情。也。。这段代码有3个独立的条件,但如果给定的字符串是“eso”,我希望所有3个字符都被更改,而不仅仅是“e”。我不确定如何做到这一点,或者我的递归是否会自行解决这个问题[?]。任何提示都将不胜感激

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

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

我建议当你测试你的代码时,记下你经常遇到的错误(什么类型的错误?你在问题中没有提到它们;scheme的错误信息通常非常丰富),并尝试修复每一个错误。例如,如果你

(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)))))])))
string->list:需要类型为的参数;给定我的输入
然后您就知道您提供的
string->list
myinput
类型有问题。这种类型的错误在代码中出现过几次。当递归输入类型出现问题时,我喜欢使用的一种方法是使用帮助函数/包装函数(提示)

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


我希望这能帮助你找到正确的方向,如果你需要更多的建议,请告诉我

谢谢你的指点。在上面的代码中,我不断得到错误“除了在car中,_uu不是一对”,我不太理解,因为包含这些字符的列表可以分解为car和cdr。我已经做了一些更正,现在我的代码使我的笔记本电脑崩溃了:P我不明白的主要问题是如何同时检查所有3个字符。对于3个字符,可以这样想:你正在浏览一个列表,对于列表中的每一项,你都要检查它是“好”还是“不好”(e、s、o,然后替换),直到你到达列表的末尾。所以你想做的是假设你有一个列表(cons s(cons e(cons a empty)),你检查s,把它改为5,保持5,检查e,把它改为3,保持5和3,检查a,它保持a,保持5,3,a,检查空,完成,这样你现在就有了(cons 5(cons 3(cons a empty)))。事实上,字符出现的次数和列表的长度并不重要。至于错误,这是因为您有一个语法错误(equal?(string->list(car string)))s应该是(equal?(car(string->list string))),第三种情况也是如此,第一种情况没有问题-因为car将列表作为参数。很抱歉,我没有看到您的编辑。car错误仍然存在,因为您将字符串作为参数而不是列表。提示:您的leet speak函数接受字符串,但您希望使用列表递归。所以leet助手应该获取一个列表并返回一个列表,leet speak获取一个字符串并返回一个字符串。我想这是我能帮到的最大的忙了,而不必给出答案(因为这是一个Homwork):P祝你好运!啊,好吧,我知道我的问题出在哪里了。谢谢
string->list : expects argument of type <string>; given myinput