Inverser les Numéros de la fonction en utilisant la récursivité en C
Ce qui suit est une fonction qui est censé retourner à l'inverse d'un nombre en utilisant la récursivité. Cependant, il ne retourne que le dernier chiffre du numéro. J'aimerais savoir pourquoi et comment le résoudre?
int rev(int number)
{
int revNum=0, sum=100;
if(number<=9) return(number);
else if(number>0)
{
return(rev(number/10)+revNum);
revNum=(number%10)*sum; sum=sum/10;
}
}
Merci!!!!!!
que voulez-vous dire inverser le numéro? comme pour le code, tout ce qui est après que l'instruction return n'a pas de sens
il veut inverser les chiffres, donc: 1234 devient 4321
BTW: la dernière ligne
le problème, c'est surtout parce que
if(number<=9)
d'autre if(number>0)
ce que c'est??Il y a quelque chose entre 0 et 9, qui est prête à satisfaire à la fois la condition.il veut inverser les chiffres, donc: 1234 devient 4321
BTW: la dernière ligne
revNum=(number%10)...
sera jamais atteintle problème, c'est surtout parce que
sum
est pas conservé dans la récursivité, entre autres choses
OriginalL'auteur Michael Ferashire Silva | 2013-07-18
Vous devez vous connecter pour publier un commentaire.
Voici une partie du code qui fonctionne:
La raison principale de votre code ne pouvait pas travailler, d'autres que ce que j'ai fait remarquer ci-dessus, est que
sum
n'est pas conservé dans les appels. C'est un problème commun dans la prise de fonctions récursives.Pour remédier à cela, la "base" est calculée à chaque appel de fonction, au lieu d'avoir une valeur fixe. Cette aussi un peu mieux, car il permet à un plus grand nombre d'être passé, à la place de ceux qui ne sont pas plus gros que
100
(une autre limite de la code que vous avez choisi).Une autre mise en œuvre est à la base de la base en tant que second paramètre, de sorte qu'il n'a pas à être recalculé à chaque appel de fonction. Par contre, cela peut être facilement résolu par une simple macro. L'appel peut être :
Mais peut être idéalement placé dans une macro (ou d'un autre appel de fonction):
C'est un peu plus efficace, mais la différence peut ou peut ne pas être important.
c'est plus contenue, mais de moins en moins efficace, puisque la base est calculé pour chaque appel.
Ouais, mais pour être honnête, nous avons affaire à des fonctions récursives - les appels de fonction sont chers (et plusieurs paramètres de ne pas faire mieux 😉 ). Je pense que c'est uniquement à des fins d'apprentissage: transformer une fonction dans une fonction récursive, ou vice versa.
Merci beaucoup, la solution est limpide; sauf que je ne comprends pas ce qu'while(nombre/(base*10)) n'?
La valeur de
number/base*10
devrait être de 1 pour la boucle pour exécuterOriginalL'auteur tay10r
C'est la solution.
Appel ci-dessous fonctionnent comme
reverse (number, 0);
int
diviser par 10 et uneint
multiplier par 10 le nombre de chiffres: plus efficace.OriginalL'auteur monkey
Et c'est fait en une seule ligne.
bien
(num % 10)
est dernier chiffre dans le but d'être le premier que vous avez à multiplier par une valeur qui commence par un 1, continue à 0 et on a exactement autant de chiffres que votrenum
. Donc, fondamentalement, si votre numéro est123456
,(num % 10) * pow(10, (int)log10(num))
calcule première fois600000' then '50000' and so on. An when the last value which is less then
10` est retourné, il commence en additionnant les résultats.ohh... merci pour éclaircir cela
pourquoi le fait d'être dans une ligne de la rendre meilleure? a) c'est moins lisible. b) il n'est même pas récursive
vous savez... j'ai vérifié tous les deux et en termes de vitesse, de votre est un peu plus rapide que le mien. Environ 1,25 fois. Je pense que c'est à cause de
pow
etlog10
calculé lentement. Donc dans mon cas, c'est tout simplement sauver la dur de la mémoire.OriginalL'auteur Alexandru Barbarosie
Salut Une petite correction de Ton code renvoie le premier chiffre(pas derniers chiffres du numéro saisi.Voici la raison
Vous êtes le calcul de revNum après le retour à une certaine valeur, comme ce
d'où la deuxième instruction n'a pas d'effet.
Également revNum est une variable locale
Donc, à chaque fois lorsque vous appelez une fonction récursive de nouvelles copies locales de somme(variable locale) et revNum se sont créés et initialisés à 0 et 100, respectivement.
Votre récursive de l'arbre ressemble à ça,Par exemple, 596 est le numéro transmis à la fonction récursive.
Maintenant rev(5) renvoie 5(depuis le 5 < 9) à l'appelant-je.e rev(59) à partir de là à l'appelant qui est dans la main, résultant de l'affichage du premier chiffre, dans ce cas, il est de 5.
Comment résoudre ce problème?
Corriger ce problème, vous devez faire des variables globales(somme et revNum) aussi à l'instruction de retour devrait être à la fin, après le calcul de l'inverse de nombre. Voici le code simple.
J'ai fait inverse variable globale pour préserver les changements en elle, enfin je suis de retour même à l'appelant.
Salut Michael, car il est une variable globale, il sera initialisé à zéro,donc au premier temps inverse*10 deviendra zéro.
Échoue
rev(0)
comme valeur de retour n'est pas fourni.OriginalL'auteur Mahesh
n >= 0
avec encourirint
dépassement de capacité que les autres.A suggéré de simplification:
void reverse(int n) { printf("%d",n%10); if (n >= 10) reverse(n/10); }
}OriginalL'auteur klement omeri
Peut-être ce morceau de code permet de:
...ajouté plus tard...
La variante récursive ressemble à ça (j'ai utilisé deux fonctions ont souhaité signature):
Je suis sûr qu'il peut être écrit plus courte/optimisé 😉
*Jost
cela peut fonctionner mais malheureusement il n'a pas utiliser la récursivité 🙁
oups - récursivité - oui... je suis en train de travailler sur elle - sry
il peut être fait avec un seul paramètre 😛
oui, vous avez raison, mais en comptant le nombre de chiffres de l'entrée est en quelque sorte "traitement de texte" 😉
OriginalL'auteur Jost
Voici la solution récursive:
C
pasC++
Je crois que c'est le C++ que j'ai encore à apprendre, désolé 🙁
Oups, my bad! traduit de c maintenant!
OriginalL'auteur BKC
Vérifier cette récursivité version.
OriginalL'auteur Amarnath Krishnan