範例如下:
#include <functional>
#include <cstdio>
int main()
{
int fib[10] = {1, 1};
std::function<int (int)> fibonacci = [&](int index) -> int {
if (fib[index] == 0) {
if (fib[index - 2] == 0) { fibonacci(index - 2); }
if (fib[index - 1] == 0) { fibonacci(index - 1); }
fib[index] = fib[index - 1] + fib[index - 2];
}
return fib[index];
};
for (int i = 0; i < 10; ++i)
printf("fib[%d] = %d\n", i, fibonacci(i));
return 0;
}
這邊的範例是費波納希數列,並且把過程中已經計算過的數字存在陣列中以避免多餘的計算。在以往的寫法中,fib 這個陣列要嘛變成全域變數,要嘛變成 fibonacci 這個 function 的參數。因此過往的寫法中往往容易讓 recursive function 有相當多的參數是用來傳遞類似 fib 這類 recursive 的過程中會需要存取,但每次 recursive 的過程中傳入的東西永遠不會變的內容。類似的狀況在寫 DFS 這類功能會更加嚴重,未來只要利用 lambda expression 即可避免這類問題。
沒有留言:
張貼留言