web-dev-qa-db-fra.com

Calcul d'une racine imbriquée en C

On m'a demandé de calculer l'expression racine imbriquée suivante en utilisant uniquement la récursivité .

enter image description here

J'ai écrit le code ci-dessous qui fonctionne, mais ils nous ont permis d'utiliser une seule fonction et 1 entrée n à cet effet et non 2 comme je l'ai utilisé. Quelqu'un peut-il m'aider à transformer ce code en une fonction qui calculera l'expression? ne peut utiliser aucune bibliothèque sauf les fonctions de <math.h>.

sortie pour 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

Voici une autre approche.

Il repose sur le fait que int est 32 bits. L'idée est d'utiliser les 32 bits supérieurs d'un int de 64 bits pour

1) Voir si l'appel était un appel récursif (ou un appel de "l'extérieur")

2) Enregistrer la valeur cible dans les 32 bits supérieurs pendant la récursivité

// 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