手寫cps變換實現遞歸函數轉非遞歸
代碼如下
#include <stdio.h>
#include <functional>
#include <vector>
// 遞歸版本
void StartTask1(std::function<void()> f)
{
f();
}
// 非遞歸版本
std::vector< std::function<void()>> g_taskQueue;
void StartTask(std::function<void()> f)
{
g_taskQueue.push_back(f);
}
void RunTasks()
{
while (!g_taskQueue.empty())
{
auto t = g_taskQueue.back();
g_taskQueue.pop_back();
t();
}
}
// f(n) = f(n-1) + f(n-2) if n>2 otherwise 1
void f(int n, std::function<void(int)> c)
{
if (n<=2)
{
return c(n);
}
StartTask([n, c]() {
f(n - 1, [n, c](int t1) {
f(n - 2, [t1, c](int t2) {
c(t1 + t2);
});
});
});
}
void test()
{
f(5, [](int t) {
printf("%d\n", t);
});
RunTasks();
}
- 上一篇 Sandboxie開源了
- 下一篇 好像是什麽googlereoup的愛好者的介紹