编辑:
(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)))))])))
答案 0 :(得分:1)
现在假设我们使用字符串“test”测试您的程序(通过手动步进)。我们看到的第一个错误是您没有else
个案例。其次,您会注意到,当您将(car (string->list string))
与'e
进行比较时,您将始终得到错误,因为当字符串被分解时,它会被分解为字符(#\e
)而不是符号。
我建议你在测试你的代码时,记下你一直在犯的错误(你的问题是什么类型的错误?你的问题中没有提到它们;方案通常对其错误信息很有帮助)并尝试修复每一个。例如,如果你得到
string->list : expects argument of type <string>; given myinput
然后您知道您提供myinput
的{{1}}类型有问题。您的代码中会出现这种类型的错误。当我遇到递归输入类型问题时,我喜欢使用的一种方法是使用辅助函数/包装函数(提示)。
此外,测试递归程序的一种好方法是手动运行它们(例如,使用字符串“test”,如开头所述),然后查看卡住的位置并相应地修复程序。
我希望这会帮助您找到正确的方向,如果您需要更多指示,请告诉我。