注:これは単なる学習と改善のためのものです。私は配列の利用可能なソート方法を知っています。私はTCOの基本を理解しようとしています。テールコールの最適化javascript
現在、再帰を使用してソートアルゴリズムを実行しようとしています。しかし、大きなデータセット(+ 4000オブジェクト)を処理しようとすると、スタックオーバーフローエラーが発生します。私はTCOを実装しようとしています。私はかなり新しいコンセプトですが、私はそれの要点を持っていると思います。しかし、私はまだスタックオーバーフローエラーが発生しています。
const sort = (arr, counter) => {
if (!counter) {
counter = arr.length - 1;
}
for (let n = 1; n <= counter; n++) {
if(arr[n - 1] < arr[n]) {
let placeHolder = arr[n];
arr[n] = arr[n - 1];
arr[n - 1] = placeHolder;
}
}
counter -= 1;
return counter === 0 ? arr : sort(arr, counter);
};
function sortRecursive(arr) {
return sort(arr);
}
UPDATE:
私はそれが働いて得ることができたが、私はかなり理由を理解していません。私は10万回の再帰を問題なく扱うことができました。カウンタが定義されているかどうかを調べるブール値を移動しなければならなかった。しかし、私はそれがなぜ機能したのかをよく理解していません。
const sort = (arr, counter) => {
if (!counter) {
counter = arr.length - 1;
}
for (let n = 1; n <= counter; n++) {
if(arr[n - 1] < arr[n]) {
let placeHolder = arr[n];
arr[n] = arr[n - 1];
arr[n - 1] = placeHolder;
}
}
counter -= 1;
if (counter === 0) {
return arr;
} else {
return sort(arr, counter);
}
};
function sortRecursive(arr) {
return sort(arr, arr.length - 1);
}
OUTPUT:
let firstArr = [];
let secondArr = [];
for (let x = 0; x < 100000; x++) {
firstArr.push(Math.ceil(Math.random() * 100000));
secondArr.push(Math.ceil(Math.random() * 100000));
}
sortRecursive(firstArr);
//Array[100000]
それはあなたがTCOを呼び出すことは何ですか? – Ced
サンプルを入力/出力できますか? –
@CedいいえArray.sort() –