Recursion 拆分单词的函数

Recursion 拆分单词的函数,recursion,scheme,Recursion,Scheme,我想写一个函数,将一个单词拆分为第一个、中间和最后一个字符,并为每个字符创建一个单独的列表。例如: “代码”一词可分为: (list #\c "ode" #\s) 然后 然后 所以基本上,它接受任何单词,然后分割第一个和最后一个字符,然后重复这个过程,直到每个字符都被转换。有人能帮我吗?谢谢我很乐意帮你做这件事。以下是我的帮助: 您可以使用string?和char? 字符串是字符的向量。您可以使用string length获取长度,并使用string ref访问单个字符

我想写一个函数,将一个单词拆分为第一个、中间和最后一个字符,并为每个字符创建一个单独的列表。例如:

“代码”一词可分为:

(list #\c "ode" #\s)
然后

然后


所以基本上,它接受任何单词,然后分割第一个和最后一个字符,然后重复这个过程,直到每个字符都被转换。有人能帮我吗?谢谢

我很乐意帮你做这件事。以下是我的帮助:

  • 您可以使用
    string?
    char?
  • 字符串是字符的向量。您可以使用
    string length
    获取长度,并使用
    string ref
    访问单个字符
  • 字符串和向量都是零索引的,就像所有好的语言一样。使用
    +
    -
    计算所需的索引
  • 使用
    substring
    创建新的中间字符串
  • 对于实际列出的零件,可以使用
    car
    cdr
    cons
  • 方案唯一的实循环构造是递归。命名的
    let
    通常用于此类情况
  • 逻辑应该是cons第一个元素nd递归,直到找到字符串为止。在这里,您可以计算最后一个元素的索引。然后,您将
    cons
    第一个,
    cons
    新中间,cons新的最后一个字母,列表的其余部分作为最后一个cdr。你现在有一轮了
  • 如果希望在列表中不再包含字符串之前执行此操作,则需要一个外部循环。内部循环需要知道,如果最终得到的是空列表,该怎么办
下面是一个过程,它会迭代直到碰到一个字符串,然后用另一个字符串替换它。您的内部循环看起来很像:

(define (replace-first-string lst replacement)
  (let helper ((lst lst))
    (cond ((null? lst) '())
          ((string? (car lst)) (cons replacement (cdr lst)))
          (else (cons (car lst) (helper (cdr lst)))))))

(replace-first-string (list #\c "ode" #\s) "here")
; ==> (#\c "here" #\s) 

这不是一个制作字符列表的非常有效的过程。在Scheme中,我们已经有了产生相同最终结果的
string->list

您使用的是哪种方案?@Shawn我使用RacketThanks作为提示,但我也想知道如何按照问题中提到的顺序转换字符串:第一个和最后一个字符,然后将中间的字符转换为另一个单词,然后将这个单词分成第一个和最后一个字符,然后重复。@Badajoz我添加了一个迭代器示例。这应该足以解决您的问题。谢谢!谢谢你的帮助
(list #\c \o #\d #\e #\s)
(define (replace-first-string lst replacement)
  (let helper ((lst lst))
    (cond ((null? lst) '())
          ((string? (car lst)) (cons replacement (cdr lst)))
          (else (cons (car lst) (helper (cdr lst)))))))

(replace-first-string (list #\c "ode" #\s) "here")
; ==> (#\c "here" #\s)