如何使用方案编程语言查找字符串中的字符数?
Posted
技术标签:
【中文标题】如何使用方案编程语言查找字符串中的字符数?【英文标题】:How do I find the number of characters in a string using scheme programming language? 【发布时间】:2021-03-30 23:59:47 【问题描述】:我使用string-length
来获取字符数,但在定义递归函数时遇到了困难。我应该将字符串转换为列表然后计算元素吗?
【问题讨论】:
【参考方案1】:如果问题是“在不使用字符串长度的情况下计算字符串中的字符”的谜题, 那么也许:
(define (my-string-length s)
(define (my-string-length t n)
(if (string=? s t) n
(my-string-length
(string-append t (string (string-ref s n))) (+ n 1))))
(my-string-length "" 0))
或:
(define (my-string-length s)
(define (my-string-length n)
(define (try thunk)
(call/cc (lambda (k)
(with-exception-handler (lambda (x)
(k n))
thunk))))
(try (lambda ()
(string-ref s n)
(my-string-length (+ n 1)))))
(my-string-length 0))
(当然 string-ref 将使用基本字符串长度或等效值)
【讨论】:
【参考方案2】:没有有用的递归方式(甚至递归尾):Scheme 中的字符串是知道它们有多长的对象。在像 C 这样的语言中会有这样的方法,其中字符串不知道它们有多长,而是由一些特殊的标记分隔。例如,如果(special-marker? s i)
告诉你s
的第i
' 元素是否是特殊标记对象,那么你可以编写一个函数来知道字符串有多长:
(define (silly-string-length s)
(let silly-string-length-loop ([i 1])
(if (special-marker? s i)
(- i 1)
(silly-string-length-loop (+ i 1)))))
但现在想想你将如何在 Scheme 中实现 special-marker?
:特别是这里的明显实现:
(define (special-marker? s i)
(= i (+ (string-length s) 1)))
您可以看到silly-string-length
现在只是string-length
的糟糕版本。
好吧,如果您想让它看起来更糟糕,您可以按照您的建议将字符串转换为列表,然后计算列表的长度。列表由一个特殊的标记对象 ()
分隔,所以这种方法是合理的:
(define (length-of-list l)
(let length-of-list-loop ([i 0]
[lt l])
(if (null? lt)
i
(length-of-list-loop (+ i 1) (rest lt)))))
所以你可以写
(define (superficially-less-silly-string-length s)
(length-of-list
(turn-string-into-list s)))
但是,等等,turn-string-into-list
是怎么写的?好吧,可能是这样的:
(define (turn-string-into-list s)
(let ([l (string-length s)])
(let loop ([i 0]
[r '()])
(if (= i l)
(reverse r)
(loop (+ i 1)
(cons (string-ref s i) r))))))
而这个...使用string-length
。
【讨论】:
编写糟糕的函数版本是最好的学习方式。 :) (当一个人分析并意识到为什么他们很糟糕) @WillNess:我同意。重新发明***也很有用——或者例如发现你刚刚重新发现了一些久负盛名的技术,但因为你自己发现了它,你现在才真正理解它。【参考方案3】:有什么问题?
(string-length string)
【讨论】:
以上是关于如何使用方案编程语言查找字符串中的字符数?的主要内容,如果未能解决你的问题,请参考以下文章