我被要求仅使用递归来计算以下嵌套的根表达式。
我在下面编写了可行的代码,但他们只允许使用一个函数和1个输入n
来实现此目的,而不是像我以前使用的2个代码。
有人可以帮我将这段代码转换成一个可以计算表达式的函数吗?除了<math.h>
中的函数,不能使用任何库。
n = 10的输出:1.757932
double rec_sqrt_series(int n, int m) {
if (n <= 0)
return 0;
if (m > n)
return 0;
return sqrt(m + rec_sqrt_series(n, m + 1));
}
double helper(int n) {
return rec_sqrt_series(n, 1);
}
最佳答案
使用n
的高位作为计数器:
double rec_sqrt_series(int n)
{
static const int R = 0x10000;
return n/R < n%R ? sqrt(n/R+1 + rec_sqrt_series(n+R)) : 0;
}
自然,当初始
n
为R
或更大时,该功能就会出现故障。这是一个更复杂的版本,适用于n
的任何正值。有用:n
为负数时,它与上述版本类似,使用高位进行计数。 n
为正数时,如果它小于R
,它将使用-n
调用自身以评估函数,如上。否则,它将使用否定的R-1
进行自身调用。这将评估函数,就好像是使用R-1
调用了该函数一样。这会产生正确的结果,因为该序列仅在几十次迭代后就停止以浮点格式更改-较深数的平方根被稀释,因此没有作用。因此,对于所有n
,该函数在较小的阈值上都具有相同的值。 double rec_sqrt_series(int n)
{
static const int R = 0x100;
return
0 < n ? n < R ? rec_sqrt_series(-n) : rec_sqrt_series(1-R)
: n/R > n%R ? sqrt(-n/R+1 + rec_sqrt_series(n-R)) : 0;
}
关于计算C中的嵌套根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61031584/