2015年6月17日

[C++] Recursion Using Lambda Expression

C++ 的 lambda expression 搭配 std::function 就可以做到 recursion 的功能
範例如下:

#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 即可避免這類問題。

沒有留言:

張貼留言