我想编写数学函数f(x)=sqrt(1^1+sqrt(2^2+sqrt(3^3)+...+sqrt(x^x)))
,其中x应为1 <= x <= 10
。我试着像这样编程函数:
double f1Rek(int x)
{
if( x < 1 ) return sqrt(power(x,x));
return sqrt(power(x,x) + f1Rek(x-1));
}
函数power也是一个自创的递归函数:
double power(int x, int n)
{
if( n == 0 ) return 1.0;
if( x == 0 ) return 0.0;
if( exp > 0 )
{
return n * power(n, exp - 1);
}
if( exp < 0 )
{
return 1 / ( n * power(n, -(exp-1));
}
}
问题是f1Rek(int x)
函数,因为它以sqrt(x^x + sqrt( x-1^x-1...
开头。如何以非常优雅的方式解决问题?
更新
在Jim Balter的回答中,我创建了一个带有2个参数的函数:
double f2Rek(int i, int x)
{
if( i <= x )
{
return sqrt(power(i,i) + f2Rek(i+1, x));
}
else return 0.0;
}
是否有可能只使用一个参数定义递归函数。
答案 0 :(得分:2)
f(x)= sqrt(1 ^ 1 + sqrt(2 ^ 2 + ( sqrt(3 ^ 3)+ ... + ( sqrt(x ^ x))))...
(假设以粗体显示)
同样地,
f(x)= g(1,x)
,其中
g(i,n)= sqrt(i ^ i + g(i + 1,n))如果i <= n,则为0
您应该能够优雅地编写递归函数。
关于具有一个参数的函数:
f 是一个带有一个参数的函数。它调用一个带有两个参数的递归辅助函数。 很明显,递归内部函数需要两个参数,其中一个是终止值x。在具有本地函数的语言中,可以从函数中提取参数,例如,
double f(int x)
{
double g(int i)
{
return (i <= x)? sqrt(pow(i, i) + g(i+1)) : 0.0;
}
return g(1);
}
GCC支持本地功能,但它们不在标准C中。
答案 1 :(得分:1)
double f1Rek(int x)
{
double res = 0.0;
for(int i=x; i > 0; i--) {
res = sqrt(power(i,i) + res));
}
return res;
}