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