单词分割函数

问题描述 投票:0回答:1

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

“代码”一词将分为:

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

然后

(list #\c #\o "d" #\e #\s)

然后

(list #\c #\o #\d #\e #\s)

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

recursion scheme
1个回答
0
投票

我很乐意帮助您。这是我的帮助:

  • 您可以使用
    string?
    char?
  • 区分字符和字符串
  • 字符串是字符的向量。您可以使用
    string-length
    获取长度并使用
    string-ref
    访问单个字符。
  • 像所有好的语言一样,字符串和向量都是零索引的。使用
    +
    -
    计算所需的指数。
  • 使用
    substring
    创建新的中间字符串。
  • 您可以使用
    car
    cdr
    cons
    作为实际列表部分。
  • 方案中唯一真正的循环构造是递归。名为
    let
    的情况下经常使用。
  • 逻辑应该是 cons 第一个元素并递归,直到找到字符串。在那里您计算最后一个元素的索引。然后,
    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) 

这不是一个非常有效的创建字符列表的过程。在方案中,我们已经有了

string->list
,它产生相同的最终结果。

© www.soinside.com 2019 - 2024. All rights reserved.