シングルパスでプロシージャを実装することは、非再帰的であることを意味しますか?それとも、同じ情報に対して手順が2回繰り返されてはならないという意味ですか?
最初の定義だと思っていたので聞いてみましたが、再帰を使わないとわからない宿題の問題に出くわし、「1回のパスで完結」と言いました。
シングルパスとは、セットを1回だけ反復する場合です(各要素に1回だけ触れる)。
このような単純な反復でこれを達成できます
for n from 0 to set length
interact with set item n
または、再帰することもできます(c#)
public int total(int[] numbers,int index)
{
if (index == numbers.Length - 1) return numbers[index];
return numbers[index] + total(numbers, index + 1);
}
int[] someInts = {1,2,3,4};
int intTotal = total(someInts,0);
「シングルパス」とは、要素のコレクション(リスト、配列、セット、ベクトル、マップ、ツリー、グラフ、文字列など)の各要素にアクセスすることを意味します(「反復」 over ")一度だけ-手順が再帰的であるか反復的であるかは関係ありません。たとえば、Schemeの次の再帰的プロシージャは、リスト内のすべての要素を1回のパスで追加します。
(define (sum lst)
(if (null? lst)
0
(+ (car lst)
(sum (cdr lst)))))
同じプロシージャを末尾再帰的に記述できます。つまり、再帰呼び出しが別のプロシージャ内で発生した場合、それが最後のアクションになります。戻り値が生成される場合があり、その値は呼び出し元のプロシージャによってすぐに返されます。とにかく、リスト内の要素に対して実行されるパスは1つだけです。
(define (sum lst)
(let loop ((lst lst)
(acc 0))
(if (null? lst)
acc
(loop (cdr lst) (+ (car lst) acc)))))
上記の2つの例をJavaのこのコードと比較してください。これは反復法ですが、もう一度、配列に対して1回のパスが実行されます。
int sum(int[] array) {
int acc = 0;
for (int x : array)
acc += x;
return acc;
}