如何分解列表中的字符串?

How to break down strings in a list?

我要确定字符串供应列表中的任何字符串是否比提供的字符串长。我尝试使用 sting-length 来计算字符串的长度,但它不起作用。我知道因为 los 不是字符串,但我怎样才能将 LoS -> String.或者我不需要使用字符串长度。我查看了文档。有一个list-string函数,但是列表只包含char.

(define LOS-0 '())
(define LOS-1 (cons "POG" LOS-0))
(define LOS-2 (cons "WooooW" LOS-1))
(define LOS-3 (cons "Yee" LOS-2))
(define (any-longer? los)
  (cond
    [(empty? los) '()]
    [(cons? los)
     (if
      (< (string-length (first los) (string-length (rest los))))
      #true
      #false)]))

您需要查看字符串列表中是否有任何元素比给定字符串长。 Racket 函数 memf 是一种简单的方法,结合比较字符串长度的函数。它 returns 其汽车满足谓词函数的列表的尾部,或者 #f 如果 none 满足。

例如,

(define (any-longer? los str)
    (if (memf (lambda (s) (> (string-length s) (string-length str))) los)
        #t
        #f))

为了加分:将其重写为仅调用 (string-length str) 一次,并编写您自己的 memf 版本。 (如果这是家庭作业,后者可能是强制性的)

您想知道字符串列表的任何元素的长度是否比您拥有的字符串的长度长。

判断字符串列表中是否有任何元素比字符串的长度长:

  1. 算出字符串的长度,称之为l。现在我们需要确定字符串列表中是否有任何元素长于 l:

    1. 列表是否为空?如果是,那么它的任何元素都不长于 l.
    2. 列表的第一个元素不是字符串吗?如果它不是一个字符串,这是一个错误。这是一个可选步骤,但任何合格的程序都会包含它。
    3. 所以第一个元素是一个字符串:第一个元素的长度是否大于l?如果是,则该元素比字符串长,我们就完成了。
    4. 否则,计算字符串列表的rest中是否有任何元素长于l。您现在知道该怎么做了!

或者只是递归:

(define (any-longer? s los)
  (cond ((empty? los) #false)
        ((< (string-length s) (string-length (car los))) #true)
        (else (any-longer? s (cdr los)))))