0

リストと数値を引数として取り、末尾再帰を使用してリスト内の最初から数値 m の最初のインスタンスに遭遇するまでのすべての数値の合計を計算して返す Scheme プロシージャを作成するにはどうすればよいですか? (一度も遭遇しない場合、戻り値はリスト内のすべての要素の合計になります。) たとえば、(proc (list 1 2 3 4 5 6) 4) は 6 を返す必要があります。手順とその基本的なケースを実行しました。 、これは、リストが空の場合、0 を返します。ただし、リストに引数として指定された数値が含まれていないため、リスト要素の合計を返す場合は、別の基本ケースが必要です。

4

2 に答える 2

0

オスカー・ロペスの答えは正しいです。これは、named を使用した同じコードのバージョンletです (少なくとも私の意見では) 読みやすいです:

(define (add-until lst num)
  (let loop ((lst lst)
             (acc 0))
    (if (or ???
            (= ??? ???))
        acc
        (loop ??? (+ ??? ???)))))
于 2012-11-15T01:58:44.880 に答える
0

これは宿題なので、今回はストレートな答えはしません。ここでは、何をする必要があるかについての一般的な考え方を示します。空欄を埋めてください。

(define (add-until lst num acc)
  (if (or <???>            ; if the list is null
          (= <???> <???>)) ; or the current element equals `num`
      acc                  ; then return the accumulator
      (add-until           ; else make a recursive call
       <???>               ; advance to the next element in list
       num                 ; pass along the same `num`
       (+ <???> <???>))))  ; update the accumulator with current element

上記のコードでわかるように、関数が戻った後にその値を返す以外に何もすることがない場合、関数呼び出しは末尾再帰的であると言われますelseadd-until.

通常、アキュムレータは計算の部分的な結果を保持するために使用され、それは再帰の基本ケースの最後に返されます。この例では、アキュムレータが呼び出さaccれ、反復ごとにその値が更新され、最後に返されます。

もちろん、アキュムレータは適切な値で初期化する必要があります。質問の例では、次のようにadd-untilプロシージャを呼び出します。

(add-until '(1 2 3 4 5 6) 4 0)
=> 6

または、2 つのプロシージャを定義することもできます。1 つは実際の反復を実装し、アキュムレータをパラメーターとして受け取るヘルパー (これは、上で概説したものです) と、もう 1 つは 2 つのパラメーターのみを受け取り、常に初期値でヘルパー プロシージャを呼び出すものです。の値0

于 2012-11-15T00:47:09.200 に答える