使用map,filter或fold-right从字符串列表中获取长度列表

时间:2013-11-12 00:29:50

标签: scheme racket mit-scheme

  

您将获得一个字符串列表。

     

生成一个过程,以便将此过程应用于此类列表   会产生一个列表中的每个字符串的长度   输入。

     

使用mapfilterfold-right

(lengths (list "This" "is" "not" "fun")) => (4 2 3 3)

(define lengths (lambda (lst) your_code_here))

我遇到了以下代码,我不明白如何使用filter

(define lengths
  (lambda (lst)
    (if (null? lst)
        nil
        (fold-right list (string-length (car lst)) (cdr lst)))))

2 个答案:

答案 0 :(得分:1)

这似乎是map的工作,你只需将正确的程序作为参数传递:

(define (lengths lst)
  (map string-length lst))

如您所知,map将一个过程应用于输入列表中的每个元素,返回一个收集结果的新列表。如果我们对构建具有字符串长度的列表感兴趣,那么我们在每个元素上调用string-length。这个程序几乎写出来了!

建议:阅读您要求使用的程序的documentation,您编写的代码过于复杂。这显然 filter的工作,尽管也可以使用fold-right。请记住:让高阶程序处理迭代,您不必明确地执行:

(define (lengths lst)
  (fold-right (lambda (x a) 
                (cons (string-length x) a))
              '()
              lst))

答案 1 :(得分:0)

这看起来像是家庭作业所以我只会给你指点:

map接受一个过程并应用于列表的每个元素。因此

(define (is-strings lst)
    (map string? lst))

(is-strings '("hello" 5 sym "89")) ; (#t #f #f #t)

(define (add-two lst)
    (map (lambda (x) (+ x 2)) lst))

(add-two '(3 4 5 6)) ; ==> (5 6 7 8)

filter采用充当谓词的过程。如果省略了#f元素,则该元素位于结果列表中。

(define (filter-strings lst)
    (filter string? lst))

(filter-strings '(3 5 "hey" test "you")) ; ==> ("hey" "you")

fold-right获取一个初始值和一个过程,该过程采用累积值和元素并且应该生成一个新值:

(fold-right + 0 '(3 4 5 6))      ; ==> 18, since its (+ 3 (+ 4 (+ 5 (+ 6 0))))
(fold-right cons '() '(a b c d)) ; ==> (a b c d) since its (cons a (cons b (cons c (cons d '()))))
(fold-right - 0 '(1 2 3))        ; ==> -2 since its (- 1 (- 2 (- 3 0)))
(fold-right (lambda (e1 acc) (if (<= acc e1) acc e1)) +Inf.0 '(7 6 2 3)) ; ==> 2 

fold-right有一个左手兄弟迭代且速度更快,但是对于列表处理它会在处理后颠倒顺序..

(fold-left (lambda (acc e1) (cons e1 acc)) '() '(1 2 3 4)) ; ==> (4 3 2 1)