0

私はSchemeを使って関数を書こうとしています:

  1. パラメータとして 3 つ以上の要素を持つ整数のリストを受け取る
  2. n 番目の要素と (n+1) 番目の要素を合計する
  3. このリストを返す

結果は次のようになります。

> (SumNeighbors (list 1 2 3 4))
(3 5 7)

要素を追加する方法はわかったと思いますが、再帰は完全に間違っています...

(define (SumNeighbors lst)
  (if (not (null? (cdr lst)))
      (append (list (+ (car lst) (car (cdr lst)))) (SumNeighbors (cdr lst)))))

どんな助けでも大歓迎です。

4

2 に答える 2

3

この問題の解決策は、よく知られたパターンに従います。ヒントをいくつかあげますので、自分なりに答えを見つけてみるのも楽しいです。

(define (SumNeighbors lst)
  (if <???>                    ; if there's only one element left
      <???>                    ; we're done, return the empty list
      (cons                    ; otherwise call `cons`
       (+ <???> <???>)         ; add first and second elements
       (SumNeighbors <???>)))) ; and advance recursion

次の点に注意してください。

  • あなたのソリューションには基本的なケースが欠けています - トラバースしているリストに 1 つの要素しか残っていない場合はどうなりますか? 再帰を終了する時が来ました!また、出力としてリストを作成しているため、返される値は何でしょうか?
  • 通常cons、 ではなく、出力リストを作成するために使用しappendます。それがリストを作成する自然な方法です
  • ソリューション テンプレートの範囲外にあるこの手順の部分は、(通常の場合のように) リストが空になったときではなく、リストに 1 つの要素が残ったときに停止するという事実です。

入力リストを反復処理し、出力としてリストを返す多くのプロシージャが同じソリューション テンプレートに従っていることがわかります。これがどのように、なぜ機能するかを学ぶことは非常に重要です。これは、他の同様の問題に対するソリューションを記述するための基礎となります。

于 2013-11-14T20:58:25.160 に答える