在Scheme中,如何使用另一个列表的元素替换列表中的元素?

时间:2013-03-18 22:19:06

标签: list scheme switch-statement

因此,该函数应该采用3个参数,这些参数都是字符串。第一个是原始字符串。第二个是字符串中的字母应该更改。第三个是字母应该改为。例如,

~ (switch-up "aabcc" "abc" "def")

“ddeff”

我甚至不确定如何从这个开始。有什么帮助吗?

2 个答案:

答案 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-refsubstring检索字符串中的第一个字符和其余字符 - 将其视为字符串的carcdr

(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}}。