web-dev-qa-db-ja.com

Cでのネストされたルートの計算

recursionのみを使用して、次のネストされたルート式を計算するように求められました。

enter image description here

私は機能する以下のコードを書きましたが、それらは1つの関数と1つの入力nのみを使用することを許可し、2では使用できませんでした。私が使ったように。誰かがこのコードを式を計算する1つの関数に変換するのを手伝ってくれませんか? <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);
}
9
Ronen Dvorkin

ここに別のアプローチがあります。

intが32ビットであることを前提としています。アイデアは、64ビットintの上位32ビットを使用して

1)呼び出しが再帰呼び出し(または「外部」からの呼び出し)であったかどうかを確認します。

2)再帰中に上位32ビットにターゲット値を保存する

// Calling convention:
// when calling this function 'n' must be a positive 32 bit integer value
// If 'n' is zero or less than zero the function have undefined behavior
double rec_sqrt_series(uint64_t n)
{
  if ((n >> 32) == 0)
  {
    // Not called by a recursive call
    // so start the recursion
    return rec_sqrt_series((n << 32) + 1);
  }

  // Called by a recursive call

  uint64_t rn = n & 0xffffffffU;

  if (rn == (n >> 32)) return sqrt(rn);      // Done - target reached

  return sqrt (rn + rec_sqrt_series(n+1));   // Do the recursive call
}
0
4386427