使用递归函数编程数学

时间:2013-03-26 19:42:06

标签: c math recursion

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

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

2 个答案:

答案 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;
}