2

たとえば、数値のリストが与えられた場合、 x -1 = 0の(1 3 6 10 0)場合、どのように差(x i --x i-1)を計算しますか?

(この例の結果は次のようになります(1 2 3 4 -10)

私はこの解決策が正しいことを発見しました:

(定義(ペアワイズ-2 f init l)
  (最初
   (foldl
    (λ(x acc-data)
      (let([result-list(first acc-data)]
            [prev-x(2番目のacc-data)])
        (リスト
         (結果リストを追加(list(fx prev-x)))
         バツ)))
    (空のリスト0)
    l)))

(ペアワイズ-2-0'(1 3 6 10 0))
;; =>(1 2 3 4 -10)

ただし、柔軟性の低いソリューションではありませんが、よりエレガントなソリューションが必要だと思います。それはただ醜いです。

関数型プログラミングは初めてですが、コードに関する提案を聞きたいと思います。

ありがとう。

4

7 に答える 7

1

私は犬の年に計画をしていませんが、これは典型的な小さなリスパータイプの問題として私を襲います。

私は基本的な定義から始めました(親の置き忘れを無視してください-私はSchemeインタープリターを手元に持っていません:

(define pairwise-diff
    (lambda (list)
      (cond
       ((null? list) '())
       ((atom? list) list)
       (t (pairwise-helper 0 list)))))

これは、nullとatomのがらくたケースを処理してから、meatケースをヘルパーに委任します。

(define pairwise-helper
    (lambda (n list)
       (cond
         ((null? list) '())
         (t
            (let ([one (car list)])
               (cons (- one n) (pairwise-helper one (cdr list))))
         ))))

「if」を使用してこれを書き直すことができますが、私はcondを使用するように配線されています。

ここには2つのケースがあります:nullリスト-これは簡単で、他のすべてです。他のすべてについては、リストの先頭を取得し、この差分を再帰的なケースに当てはめます。それほど単純になるとは思いません。

于 2009-03-12T15:12:25.453 に答える
1

PLT Scheme plinthコードを改良して適応させた後、ほぼ完璧な解決策は次のようになると思います。

(define (pairwise-apply f l0 l)
  (もし (空? l)
      '()
      (let ([l1 (最初の l)])
        (cons (f l1 l0) (pairwise-apply f l1 (rest l))))))
于 2009-03-12T15:49:01.047 に答える
1

Haskell は私に使用するように指示しますzip;)

(define (zip-with f xs ys)
  (cond ((or (null? xs) (null? ys)) null)
        (else (cons (f (car xs) (car ys))
                    (zip-with f (cdr xs) (cdr ys))))))
(define (pairwise-diff lst) (zip-with - (cdr lst) lst))

(pairwise-diff (list 1 3 6 10 0))
; gives (2 3 4 -10)
于 2009-03-13T14:51:27.713 に答える
0
(define (f l res cur)
  (if (null? l)
    res
    (let ((next (car l)))
      (f (cdr l) (cons (- next cur) res) next))))

(define (do-work l)
  (reverse (f l '() 0)))

(do-work '(1 3 6 10 0))

==> (1 2 3 4 -10)
于 2009-04-06T12:43:48.263 に答える
0

これは最も簡単な方法です:

(define (solution ls)
  (let loop ((ls (cons 0 ls)))
    (let ((x (cadr ls)) (x_1 (car ls)))
      (if (null? (cddr ls)) (list (- x x_1))
          (cons (- x x_1) (loop (cdr ls)))))))

(display (equal? (solution '(1)) '(1))) (newline)
(display (equal? (solution '(1 5)) '(1 4))) (newline)
(display (equal? (solution '(1 3 6 10 0)) '(1 2 3 4 -10))) (newline)

各例のコード展開を書き出して、それがどのように機能するかを確認してください。

FP の使用を開始することに興味がある場合は、How To Design Program を確認してください。確かに、プログラミングにまったく慣れていない人向けに書かれていますが、中には優れた FP イディオムがたくさんあります。

于 2009-03-27T18:36:27.490 に答える