我正在尝试(在 C++ 中)模拟我在 SICP(Abelson/Sussman 的计算机程序的结构和解释)中学到的累加器传递风格。他们使用Scheme 来实现,尽管同样的想法也适用于支持高阶函数的其他语言。例如,下面是在 Python 中使用累加器传递样式的阶乘函数:
def fac(n):
def facAcc(i, acc):
if (i == n):
return acc
else:
return facAcc(i+1, (i+1)*acc)
return facAcc(0, 1) # 0! = 1
>>> list(map(fac, range(0,6)))
[1, 1, 2, 6, 24, 120]
由于 C++ 支持 lambda,看起来应该可以在 C++ 中做同样的事情。我尝试过,但无法让 g++ 编译递归 lambda。
不知道为什么你坚持使用 lambda,但这是一个将你的内部函数作为 lambda 的版本:
#include <iostream>
#include <functional>
long long fac(int n)
{
std::function<long long(int, long long)> facAcc;
facAcc=[n, &facAcc](int i, long long acc) -> long long {
if (i==n)
{
return acc;
}
else
{
return facAcc(i+1, (i+1)*acc);
}
};
return facAcc(0, 1);
}
int main()
{
for (int i=0; i<6; i++)
{
std::cout << fac(i) << '\n';
}
}
stieber@gatekeeper:~ $ g++ Test.cpp && ./a.out
1
1
2
6
24
120