递归是一种函数调用,函数调用自身。这些函数也称为递归函数。结构递归是一种解决问题的方法,其中问题的解决方案取决于对同一问题的较小实例的解决方案。
我正在尝试编写一个返回第 n 个勒让德多项式的系数的函数。 // 存储以前的多项式以使递归过程更快 无序_地图 我正在尝试编写一个返回第 n 个勒让德多项式的系数的函数。 // store previous polynomials to make the recursive process faster unordered_map<int, vector<double>> legendre_cache; // Recursive function to compute the coefficients of the nth Legendre polynomial vector<double> legendre_polynomial(int n) { // uses Bonnet's recursion formula P_{n+1} = ( (2n+1) x P_n - n P_{n-1} )/(n+1) // Check if the result is already in the cache if (legendre_cache.find(n) != legendre_cache.end()) { return legendre_cache[n]; } // Base cases if (n == 0) { return { 1.0 }; // P0(x) = 1 } if (n == 1) { return { 1.0, 0.0 }; // P1(x) = x } // Get coefficients for P_(n-1) and P_(n-2) vector<double> Pn_minus_1 = legendre_polynomial(n - 1); vector<double> Pn_minus_2 = legendre_polynomial(n - 2); // Get the sizes of the vectors to n+1 Pn_minus_1.push_back(0.0); // P_{n-1} gets multiplied by x Pn_minus_2.insert(Pn_minus_2.begin(), 0.0); // P_{n-2} needs two leading digits Pn_minus_2.insert(Pn_minus_2.begin(), 0.0); // Calculate coefficients for P_n vector<double> Pn(n + 1, 0.0); // Initialize Pn with n+1 zeros // Using the recurrence relation to fill coefficients for (int k = 0; k <= n; k++) { Pn[k] += ((2 * n - 1) * Pn_minus_1[k] - (n - 1) * Pn_minus_2[k]) / n; } // Store the result in the cache before returning legendre_cache[n] = Pn; return Pn; } 该算法有效,因为我将其结果与 n = 10 以内的其他来源进行了比较。 然而,这个函数很快就会变得不准确,而且它的递归性质并没有给它带来好处: 在这里,我评估我的多项式并将其与“boost/math”库中的类似函数进行比较: int main() { cout << fixed << setprecision(15); // Example inputs int n = 48; double x = 0.9; cout << "Result of my function:" << endl; vector<double> coeffs = legendre_polynomial(n); double result = 0; int l = coeffs.size(); for (int i = l - 1; i >= 0; i--) { result += coeffs[l - i - 1] * pow(x, i); } cout << result << endl; cout << "Result of boost library:" << endl; cout << boost::math::legendre_p(n, x) << endl; return 0; } n 越大,我的函数就越不准确,直到 n = 45 左右时完全崩溃: 测试代码的输出: Result of my function: 0.151876441197771 Result of boost library: -0.106892037065314 我从 boost 网站 知道 boost 函数使用与我相同的递归方法。 因此,假设他们的功能有效,那么也应该可以改进我的功能。 感谢您的帮助。 编辑1: 需要明确的是,我评估多项式只是为了证明我的系数是错误的;我主要需要多项式的系数(勒让德高斯求积)。 据我了解库中的函数,我认为那里从未提到过系数;递归公式仅应用于特定的 x 值。 坦率地说,我还没有达到重写代码来提取系数的水平。 编辑2: 我所说的“该算法是有效的,因为我将它的结果与其他来源的结果进行了比较,最多为n = 10”,我怀疑如果没有准确性错误,该函数将会起作用。我认为由于舍入、除法、浮点导致的错误会因为递归而像滚雪球一样不断增加,直到函数变得不可用。 (我的问题是如何处理这个问题) 我认为您无法像您一样计算勒让德多项式在给定点的值,即直接使用多项式的系数。事实上,您将面临数值错误,因为当多项式的阶数很大时,double无法处理x与“巨大”系数的乘法。 相反,您可以直接依赖这些多项式的三项递推关系来计算给定点的值: #include <iostream> #include <iomanip> #include <boost/math/special_functions/legendre.hpp> int main(int argc, char* argv[]) { std::cout << std::fixed << std::setprecision(15); int n = argc>=2 ? atoi(argv[1]) : 48; double x = 0.9; double p0=1; double p1=x; for (size_t k=1; k<n; k++) { double tmp = ( (2*k+1)*x*p1 - k*p0) / (k+1); p0=p1; p1=tmp; } std::cout << "Result of my function:" << std::endl; std::cout << p1 << std::endl; std::cout << "Result of boost library:" << std::endl; std::cout << boost::math::legendre_p(n, x) << std::endl; return 0; } 可能的输出: Result of my function: -0.106892037065314 Result of boost library: -0.106892037065314
我想将文件上传到我的nextcloud 服务器。问题是我遇到了一个错误。第一个curl命令应该创建目录。 卷曲-u“$ USER”:“$ PW”\ -X MKCOL \ ...
我一直在尝试理解JavaScript上下文中的尾调用优化,并为factorial()编写了以下递归和尾递归方法。 递归: 函数阶乘 (n)...
我有一个用户列表,即 user_list=["用户1","用户2","用户3"] 我有一个名为搜索的功能,它搜索用户及其经理,然后搜索经理的经理和...
你能解释一下为什么这个程序会进行类型检查吗 让rec plop1:'a'b'c。 'a -> 'b * 'c = fun x -> (fst (plop1 ""), snd (plop1 1)) 而这个没有? 让rec plop2(t...
我的入门教程突然变得非常高级了。我不知道这个程序是如何工作的。你能用通俗的语言解释一下吗? 最后它打印了 (((1 * 3) + 5) * 3),但我不明白......
我正在尝试用 C 语言递归实现 strlen 函数,由于某种原因,它返回的值是预期的 4 倍。 int *strlen(字符*s) { if(*s == ' ') 返回0; 电子...
问题如下。 main() 通过调用 isPrime() 检查数字 1-10。我认为我的数学是正确的,但是除 2 之外的每个数字都不是素数。 我已经检查了一些解决方案...
我目前正在 SystemVerilog 中编写一些代码,以查找字符串中匹配的括号。该代码接受一个名为 str 的数组,该数组包含 n 个字符,每个字符长 4 个字节。该字符串将有...
编写递归systemverilog代码来查找字符串中不匹配的括号?
我目前正在 SystemVerilog 中编写一些代码,以查找字符串中匹配的括号。该代码接受一个名为 str 的数组,该数组包含 n 个字符,每个字符长 4 个字节。该字符串将有...
我需要一些帮助来创建具有递归性的 SQL 查询 (POSTGRES)。 让我们解释一下。 这是我的表的一部分,名为“employe”。 id字符串 名词字符串 经理字符串(参考列 i...
我的数据如下所示 Col_X Col_Y 一个 乙 乙 c c d d e f 克 t y y r q w n 米 米 k 米 z 我的最终目标簇表应该是这样的: 簇 ABCDE 弗格 纳米克兹 qw 提尔 我的伪数据
如何增加 ruby 应用程序的堆栈大小。递归应用程序获取:堆栈级别太深(SystemStackError)
在 stackoverflow.com 上发布堆栈溢出问题,多有趣:-) 我正在运行一些递归 Ruby 代码,并收到以下消息:“堆栈级别太深 (SystemStackError)” (我很确定c...
每次如果语句为假,则将 LET 变量加 1,循环 IF 语句直到为真
我正在尝试制作一个动态书籍索引,列出指定页面所在的章节。我有一个表格,该章节在一列中。在另一列中,用户应在
我对lua非常陌生,我想了解以下行为。 当我尝试运行以下递归函数时: 局部函数 = 函数 ( n ) 如果 n == 1 则返回 1 否则返回 n * fu...
我学习DSA很长时间了..在学习过程中,我遇到了一个概念“二叉树中的左视图方法”。我已经完全编写了我的代码脚本,但是当我尝试提供修改后的 b 时出现错误...
我从 Java 服务器收到一个对象,其中包含文件列表和组列表。对应的Typescript对象是: 导出类组{ 文件:文件[]; 组:组[]; 常量...
Java 练习:使用字符数组从字符串中删除字母,仅删除 1 个字符
我们在课堂上练习递归,其中一个练习给我带来了麻烦(不允许使用循环)。我应该编写一个接受字符串和字符数组的方法......
类型错误:“int”类型的对象没有 len(),然后我将 list 传递给 func
我想写一个递归函数,计算数组中元素的和,但是当我将数组传递给函数时,它认为我传递了一个整数,并写道没有...