如何使用方案编程语言查找字符串中的字符数?

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)

【讨论】:

以上是关于如何使用方案编程语言查找字符串中的字符数?的主要内容,如果未能解决你的问题,请参考以下文章

R语言分数字符串变小数

c语言,查找数组中是不是存在某个数?

Python中的 len() 是什么?如何使用 len() 函数查找字符串的长度

如何在R语言中查找具有连续字母的字符串中的单词

C语言,输入一个字符串,统计重复出现某个字母的次数。

c语言编写一个程序,实现查找一个字符串中的特定字符,并将其删除.