C++ 中累加器传递风格

问题描述 投票:0回答:1

我正在尝试(在 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。

c++ lambda functional-programming
1个回答
0
投票

不知道为什么你坚持使用 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
© www.soinside.com 2019 - 2024. All rights reserved.