0

文字列のリストが表示されます。

この手順をそのようなリストに適用すると、入力内の各文字列の長さのリストが得られるような手順を生成します。

mapfilter、またはを使用しfold-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)))))
4

2 に答える 2

1

これは の作業のようmapです。正しい手順をパラメーターとして渡すだけです。

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

ご存知mapのように、入力リストの各要素にプロシージャを適用し、結果を収集する新しいリストを返します。文字列の長さでリストを作成したい場合は、string-length各要素を呼び出します。手順はほとんどそれ自体を記述します!

アドバイス: 使用するように求められている手順のドキュメントを読んでください。あなたが書いているコードは非常に複雑です。これは明らかにの仕事ではありませんでしたが、使用することもできました。覚えておいてください: 高階の手続きに反復処理を任せてください。明示的に行う必要はありません:filterfold-right

(define (lengths lst)
  (fold-right (lambda (x a) 
                (cons (string-length x) a))
              '()
              lst))
于 2013-11-12T01:00:12.653 に答える
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)
于 2013-11-12T01:03:09.077 に答える