手寫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();
}

Powered by Jekyll and Theme by solid

本站总访问量