JS程式設計建議 31 使用迭代

2021-09-22 19:10:25 字數 961 閱讀 7797

建議31:使用迭代

任何可以用遞迴實現的演算法都可以用迭代實現。迭代演算法通常包括幾個不同的迴圈,分別對應演算法過程的不同方面。雖然迭代也會導致效能問題,但是使用優化的迴圈替代長時間執行的遞迴函式可以提高效能,因為執行乙個迴圈比反覆呼叫乙個函式的開銷要低。

例如,合併排序演算法是最常用的以遞迴實現的演算法。下面是乙個簡單的合併排序演算法:

function merge(left, right) else

}return result.concat(left).concat(right);

}function mergesort(items)

var middle = math.floor(items.length / 2), left = items.slice(0, middle), right = items.slice(middle);

return merge(mergesort(left), mergesort(right));

} 這個合併排序**相當簡單直接,其中mergesort()函式被呼叫得非常頻繁。對乙個超過1500項的陣列進行操作,就可能在firefox 上導致棧溢位。程式陷入棧溢位錯誤並不一定要修改整個演算法,這說明遞迴不是最好的實現方法。合併排序演算法還可以用迭代實現,例如:

function mergesort(items)

var work = ;

for(var i = 0, len = items.length; i < len; i++)

work.push();

for(var lim = len; lim > 1; lim = (lim + 1) / 2)

work[j] = ;

}return work[0];

} 在上面**中,mergesort()實現與上乙個 merge函式同樣的功能卻沒有使用遞迴。雖然迭代可能比遞迴合併排序慢一些,但是它不會像遞迴那樣影響呼叫棧。將遞迴演算法切換為迭代是避免棧溢位錯誤的方法之一。

JS程式設計建議 15 避免使用continue

建議15 避免使用continue continue語句與break語句用法相似,在迴圈結構中用於控制邏輯的執行方向。break語句用於停止迴圈,而continue語句卻用於再次執行迴圈。與break語句語法相同,continue語句可以跟隨乙個標籤名,用來指定繼續執行的迴圈結構的起始位置。cont...

使用迭代器程式設計

輸入迭代器 輸入迭代器是最普通的型別。輸入迭代器至少能夠使用 和!測試是否相等 使用 來訪問資料 使用 操作來遞推迭代器到下乙個元素或到達past the end值 為了理解迭代器和stl函式是如何使用它們的,現在來看一下find 模版函式的定義 template inputiterator fin...

JS程式設計建議 29 準確使用迴圈體(3)

建議29 準確使用迴圈體 3 如果for迴圈的迴圈條件比較複雜,不是簡單的數值迭代,這時for語句就必須考慮如何把迴圈條件和迴圈語句聯絡起來才可以正確地執行整個for迴圈。因此,根據for結構的運算順序,for語句首先計算第乙個和第二個表示式,然後執行迴圈體語句,最後返回執行for語句的第三個表示式...