1

この手順は、与えられた手順に従って vec1 の値を置き換えることになっています。したがって、プロシージャが の場合+、vec1 の各値が各要素の合計に置き換えられます。例えば:

~ (define v (vector 1 2 3 4 5 6))
~ (vector-join v + v)
~ v
#(2 4 6 8 10 12)

再帰に問題があることは知っていますが、それを修正する方法がわかりません。私は、この種の問題で正しいことだとは思わないコンスで再帰を行う方法を学んだだけです。

これまでの私のコードは次のとおりです。

(define v (vector 1 2 3 4 5 6))

(define (vector-join vec1 pre vec2)
  (define (help v1 proc v2 i)
    (if (null? v1) v1
        (if (null? v2) v1
            (if (>= i (vector-length v1)) v1 
                (cons (vector-set! v1 i (proc (vector-ref v1 i) (vector-ref v2 i)))
                      (help v1 proc v2 (add1 i)))))))  
  (help vec1 pre vec2 0))

これを入力すると:

(vector-join v + v)

それはこれを返します:

(#<void> #<void> #<void> #<void> #<void> #<void> . #(2 4 6 8 10 12))

#voids最後の部分は正しい答えですが、なぜ出てくるのかわかりません。何か助けはありますか?

4

1 に答える 1

0

、この回答とは何の関係もないことconsに注意してください。ここではリストを扱っていません。null?また、パラメータとして受け取ったベクトルの 1 つを変更しています。これは最善のアイデアではありませんが、当面はその事実を無視しましょう。いつものように、ソリューションの一般的な構造を説明しますので、詳細を確認してください。

(define (vector-join vec1 pre vec2)
  (define (help v1 proc v2 i)
    (cond (<???> v1)            ; what's the exit condition?
          (else
           <???>                ; set the current value at position `i`
           <???>)))             ; advance the recursion, no consing here!
  (help vec1 pre vec2 0))

終了条件は「iがベクトルの外にあるとき」であり、通常の場合i、次の位置に移動する前に、ベクトル内の現在の位置 ( で示される) を更新します。再帰はインデックスを越えて進みます。を変更しているv1ので、それが手順の最後に返されます。期待どおりに動作します:

(define v (vector 1 2 3 4 5 6))
(vector-join v + v)
=> '#(2 4 6 8 10 12)

この手順は、命令型言語のソリューションを思い起こさせる方法で記述されています。異常な部分 (Scheme プログラムの場合) は、2 番目<???>にデータ構造 (この場合はベクトル) を変更しているという事実ですが、値のためではなく効果ためだけに行っています。問題のコードに表示されていたvector-set!すべてを説明する有用な値を返しません。#<void>

于 2013-04-10T21:14:38.603 に答える