0

我想编程数学函数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;
}

是否有可能定义一个只有一个参数的递归函数。

4

2 回答 2

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 中。

于 2013-03-26T19:49:51.380 回答
1
double f1Rek(int x)
{  
   double res = 0.0;
   for(int i=x; i > 0; i--) {
     res = sqrt(power(i,i) + res));
   }
   return res;
}
于 2013-03-26T19:55:48.443 回答