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

1つの引数だけで再帰関数を定義する可能性はありますか?

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))if i <= n、それ以外の場合0

そこから再帰関数をエレガントにコーディングできるはずです。

1つの引数を持つ関数に関して:

f1つの引数を持つ関数です。2つの引数を取る再帰ヘルパー関数を呼び出します。再帰的な内部関数には2つの引数が必要であり、そのうちの1つは終了値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 に答える