【问题标题】:Function that splits word拆分单词的功能
【发布时间】:2020-10-25 19:40:18
【问题描述】:

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

“代码”一词将分为:

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

然后

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

然后

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

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

【问题讨论】:

  • 你使用的是哪种方案?
  • @Shawn 我正在使用球拍

标签: recursion scheme


【解决方案1】:

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

  • 您可以使用string?char? 区分字符和字符串
  • 字符串是字符向量。您可以使用string-length 获取长度,并使用string-ref 访问单个字符。
  • 字符串和向量是零索引的,就像所有好的语言一样。使用+- 计算所需的索引。
  • 使用substring 创建新的中间字符串。
  • 您使用carcdrcons 作为实际列表部分。
  • 方案只有真正的循环结构是递归。命名为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) 

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

【讨论】:

  • 感谢提示,但我也想知道如何按照我在问题中提到的顺序转换字符串:第一个和最后一个字符,然后将中间变成另一个单词,然后打破这个将单词分成第一个和最后一个字符,然后重复。
  • @Badajoz 我添加了一个示例迭代器。这应该足以解决您的问题。
  • 谢谢!感谢帮助
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2013-02-08
  • 2021-03-11
  • 2010-09-11
  • 2016-02-26
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多