2013-06-08 5 views
-2

Je dois créer une fonction récursive qui reçoit un nombre par deux sans utiliser /.Fonction récursive diviser un nombre

C'est ce que je l'ai écrit, mais il ne fonctionne que si après une division sera toujours un nombre décimal et non un flotteur, c'est la raison pour laquelle j'ai demandé.

int recursive(int a, int b){ 
    if (a == (0.5 * b)) 
    return a; 
    return recursive(a-1, b); 
} 

BTW, la fonction ne peut recevoir que 1 paramètre non 2 ou plus:/

+0

double possible de [fonction récursive qui divise le nombre par 2 sans utiliser /](http://stackoverflow.com/questions/16996342/recursive-function-that-divides-the-number-by-2-without-using) – Mat

+0

Je sais, mais si personne ne me rouvre le post ou m'aide, qu'est-ce que je suis censé faire ?? – Boris

+0

Modifiez votre question précédente pour la rendre plus claire. Je ne suis pas sûr de comprendre le rôle des flotteurs là-haut. Ne postez pas vos questions. – Mat

Répondre

0

Vous pouvez essayer cela, il devrait fonctionner:

int dividebytwo (int a){ 
    static int answer = 0; 

    if (a < 0){ 
     if ((answer * 2) > a){ 
      answer --; 
      return dividebytwo (a); 
     } 

     return answer; 

    } else if (a > 0){ 
     if ((answer * 2) < a){ 
      answer ++; 
      return dividebytwo (a); 
     } 

     return answer; 
    } 

    return 0; 
} 

L'astuce ici est l'utilisation de l'attribut static. L'attribut statique signifie que la variable n'est initialisée qu'une seule fois et conserve sa valeur après chaque appel de fonction. Vraiment, vous utilisez deux paramètres, mais il semble que vous n'en utilisiez qu'un seul. Le seul inconvénient de cette fonction est que vous pouvez seulement compter dessus pour travailler plus d'une fois. Puisque c'est probablement pour une simple tâche de devoirs, cela n'a probablement pas d'importance. Mais en réalité, cela est considéré comme extrêmement inefficace et peu fiable.

Pour compenser le facteur only-works-once, peut ajouter une de ces corrections:

  • déclare answer en tant que variable globale et le mettre à 0 avant chaque appel de fonction.

  • d'ajouter return answer = 0; à la fin de la fonction, au lieu de return 0;. C'est ainsi que chaque fois que vous voulez l'appeler à nouveau, vous l'appelez auparavant dividebytwo (0);.

Je peux insister assez sur comment bizarre d'un concept est ce, il définit de toutes sortes de drapeaux rouges pour toute personne qui pratique la programmation minutieuse - pourrait être la raison pour laquelle vous obtenez tant de downvotes. Donc, utilisez avec prudence!

+0

Vraiment merci, je n'ai tout simplement pas de commentaires, merci. – Boris

+0

mais avec chaque -/++ la réponse statique va changer, et si vous n'écrivez pas le statique, cela fonctionnera aussi. – Boris

+0

essayez de sortir 'static' et voir ce qui se passe, vous obtiendrez un débordement de pile. Donc non, ça ne marchera pas sans static. Aussi, j'ai ajouté quelques informations dans ma réponse que vous devriez lire. – tay10r

1

Je pense que vous avez besoin de quelque chose comme ça

int divide(int a, int b){ 
    if(a - b <= 0){ 
     return 1; 
    } 
    else { 
     return divide(a - b, b) + 1; 
    } 
} 
+0

Merci pour la réponse, mais s'il vous plaît lire attentivement: renvoie "n/2" sans diviser Et il ne peut recevoir que 1 paramètre. – Boris

+0

Renvoie une décimale – Boris

+0

Je vois "int récursive (int a, int b)" que signifie "il veut un flotteur"? @Taylor – salvo

0

Ceci divise par deux en utilisant la soustraction et la récursion répétées.

int divide_by_two(int a) { 
    if (a < 0) return -divide_by_two(-a); 
    if (a < 2) return 0; 
    return 1 + divide_by_two(a - 2); 
} 

En généralisant, cela divise a par soustraction répétée en utilisant b et récursivité.

int divide(int a, int b) { 
    if (a < 0) return -divide(-a, b); 
    if (b < 0) return -divide(a, -b); 
    if (a < b) return 0; 
    return 1 + divide(a - b, b); 
} 

Remarque, ces fonctions ne autour de la même façon que la division est définie à faire en C.

0
#include<stdio.h> 
int divide(int a, int b){ 
    if(a-b < 0) 
     return 0; 
    else if (a-b == 0) 
     return 1; 
    else { 
     return divide(a-b, b) + 1; 
    } 
    } 

http://codepad.org/o4CoiaON