1

私は次のように蓄積するための呼び出しに取り組んできました:

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

しかし、フィルターを通して何かを選択して二乗しようとすると、答えは機能しません。私がこれまでに持っているのはこれです:

(define (f2b items)
   (accumulate (lambda (x y)
     (cons (append 
        (map square (filter negative? (filter number? x))) x) y)) () items)
  )

私が与える入力は次のとおりです。

(f2a '(("sdas" 89) (-53 "sad")))

私が得る出力は次のとおりです。

 ((sdas 89) (2809 -53 sad))

負の数をなくすことができないようです。

4

2 に答える 2

2

フィルターとマップを使用する方がはるかに簡単です。フィルターは事前定義されていますが、次のようになります。

   (define (filter1 predicate sequence)
          (cond 
               ((null? sequence) null)
                ((predicate (car sequence))
                 (cons (car sequence)
                       (filter predicate (cdr sequence))))
                (else (filter predicate (cdr sequence)))))

map も事前定義されており、リストに対して関数を実行するだけです。

これは非常に簡単に記述できるはずですが、ヘルプが必要な場合は、フィルターの述語のラムバを記述してください。

于 2012-11-04T16:22:56.877 に答える
1

実際、あなたが説明する機能は通常、アキュムレータの仕事ではありません。代わりに、リスト内の負の数を 2 乗することは、マップのようなものにとって完璧な仕事のように思えます。

まず、やってみましょう:

(define (make-positive x)
    (if (and (number? x) (negative? x))
        (square x)
        x))

というリストを操作したいとしますlst。のような単純なリストである場合は'(1 "2" -5 -4 6)

(map make-positive lst)

2 レベルの深さでネストされたリストを操作する必要があるため、次のようにすることができます。

(map (lambda (x)
        (map make-positive x))
     lst)

任意の深さでネストされたリストを操作したい場合は、次のようにすることができます。

(define (nested-map fn elm)
   (if (list? elm)
       (map (lambda (x) (nested-map fn x)) elm)
       (fn elm)))

(nested-map make-positive lst)

mapPS - 次のように定義できます。

(define (map fn lst)
   (if (empty? lst)
       '()
       (cons (fn (car lst))
             (map fn (cdr lst)))))
于 2012-10-31T07:04:04.850 に答える