因此,该函数应该采用3个参数,这些参数都是字符串。第一个是原始字符串。第二个是字符串中的字母应该更改。第三个是字母应该改为。例如,
~ (switch-up "aabcc" "abc" "def")
“ddeff”
我甚至不确定如何从这个开始。有什么帮助吗?
答案 0 :(得分:0)
概述:创建从旧信到新信的映射。走原始列表,用新的旧字母替换每个旧字母。假设所有参数都是列表(否则需要string->list
):
(define (switch-up list old new)
(let ((old-to-new (map cons old new)))
(let switching ((list list) (result '())
(if (null? list)
(reverse result)
(switching (cdr list)
(cons (cond ((assoc (car list) old-to-new) => cdr)
(else (car list)))
result))))))
答案 1 :(得分:0)
这看起来像是家庭作业,所以我会给你一些提示,使用你可以使用的程序解决问题。首先将问题分解为更简单的部分 - 首先,实际的switch-up
过程基本上迭代输入字符串中的每个字符,依次处理每个字符并使用结果构建新字符串。提示:使用string-ref
和substring
检索字符串中的第一个字符和其余字符 - 将其视为字符串的car
和cdr
。
(define (switch-up lst letters replacements)
(if <???> ; if the string is empty
<???> ; return the empty string ""
(string-append (replace <???> <???> <???>) ; otherwise string-append the replacement of the first character in the string
(switch-up <???> letters replacements)))) ; and advance the recursion over the rest of the string
其次,我们需要一个replace
过程,给定单个字符以及字母和替换,返回替换的字符串或具有相同输入字符的字符串(如果未找到):
(define (replace c ls rs)
(let ((idx (index-of ls c))) ; get the index of c in the `ls` string
(if idx ; if the index was found
(string (string-ref rs idx)) ; then get the corresponding value from `rs`
(string c)))) ; otherwise, return c unchanged
最后,我发现在上一个过程中有用,可以定义一个帮助程序,它返回ls
字符串内的字符索引(如果在字符串中找不到该字符,则返回#f
) ,所以很容易去替换字符串中找到它。提示:使用str
string->list
转换为字符列表非常有用
(define (index-of str c)
<???>) ; ToDo: return the 0-based index of c inside str
别忘了测试一切:
(switch-up "aabcc" "abc" "def")
=> "ddeff"
替代方法:如果您首先将字符串转换为字符列表(使用string->list
),并且最后将它们转换回字符串,则问题可能更容易解决,使用{ {1}}。