在std::generate中使用lambda相关逻辑时编译报错,问题出在哪里?
解决你的二项式系数vector填充编译错误
嘿,咱们先把这个编译错误的根源搞清楚:你用std::generate的时候传错参数啦!
std::generate的第三个参数要求是一个不需要参数的可调用对象——简单说就是,你得给它一个“能当函数用的东西”,它会反复调用这个东西,把返回值塞进容器里。但你写的binomial(n, cnt++)是直接调用了binomial函数,得到的是一个具体的整数,不是可调用的函数/对象,编译器自然会报错说“这个东西不能当函数调用”。
快速修复方案
把那个直接调用改成一个lambda表达式,让它每次被generate调用时,自动递增cnt并计算对应的二项式系数。修改后的generate调用部分如下:
std::generate(v.begin(), v.end(), [&]() -> int { return binomial(n, cnt++); });
这个lambda通过引用捕获了n、cnt和binomial,每次被调用时,它会用当前的cnt值计算C(n, cnt),然后把cnt加1,完美符合std::generate的要求。
额外优化建议
你的递归版二项式系数计算虽然逻辑正确,但存在大量重复计算(比如计算C(5,2)时会重复计算C(4,1)和C(4,2)的子问题),当n稍微大一点时效率会很低。如果要更高效,可以改用杨辉三角的迭代递推方式,直接在vector上原地计算:
int main() { int n; std::cin >> n; std::vector<int> v(n + 1, 1); // 初始化所有元素为1,对应C(n,0)和C(n,n) for (int i = 1; i < n; ++i) { // 从后往前递推,避免覆盖还没用到的值 for (int j = i; j > 0; --j) { v[j] += v[j - 1]; } } std::cout << v << std::endl; }
这种方式时间复杂度是O(n²),没有重复计算,运行效率比递归版高很多,代码也更简洁。
内容的提问来源于stack exchange,提问作者paddel
相关产品推荐
相关产品推荐

