-1
votes

Impossible de trouver un problème de récursion de haskell simple

J'essaie d'écrire un programme de haskell simple qui résume les chiffres d'un entier par exemple mon entier est 888, la somme doit donc être de 8 + 8 + 8 = 24. J'ai eu cette partie de cette partie, mais je veux que mon programme continue à aller jusqu'à ce qu'il n'y ait rien à ajouter par exemple après l'ajout de 8 + 8 + 8 = 24, il devrait ajouter 2 + 4 = 6, puis revenir 6. Merci de l'aide! < Pré> xxx


0 commentaires

3 Réponses :


2
votes

Votre fonction est bonne pour une seule itération. Il vous suffit de l'appeler de manière récursive jusqu'à ce que vous obteniez un résultat à 1 chiffre (ou une liste vide, bien sûr).

Nous allons commencer par votre fonction existante, que j'ai renommée et réécrite de manière à renvoyer la liste dans l'ordre opposé (avec le chiffre des unités en premier). Ce n'est pas du tout nécessaire et vous pouvez utiliser exactement votre définition précédente (puisque la seule chose que nous sommes intéressés jusqu'à présent, c'est la somme de la liste, pour laquelle la commande n'a pas d'importance), mais ce sera plus pratique si vous devez reconstruire le numéro dans la liste des chiffres (et je pense aussi que je pense que cela fonctionne un peu mieux): p> xxx pré>

et voici le TODIGIT Code> Fonction: P>

toDigit :: Integral x => x -> [x]
toDigit x
    | length firstResult < 2 = firstResult
    | otherwise = toDigit . sum $ firstResult
    where firstResult = todigitsOnce x


4 commentaires

Merci pour l'aide ! Je comprends cela un peu mieux maintenant. Mais il y a un autre problème que le code compile, mais lorsque je l'exécute, le programme est suspendu sans aucune sortie.


Merci, malheureusement, je ne suis pas capable de le déboguer pour le moment, ça sonne comme une récursion infinie en cours. Vous fera savoir quand je propose un correctif. (Heureux de prendre des suggestions de la galerie aussi :))


Ok, y travaillant à la main, j'ai compris pourquoi c'est dans une boucle infinie. J'ai oublié que j'ai besoin d'un cas non récupéré dans FirStresult aussi! Va éditer tout de suite pour ajouter ceci. (En fait, ce faisant, j'ai réalisé qu'il y avait de plus gros problèmes. Toutes mes excuses, laissez-moi réécrire complètement cela ...)


À droite, excuses pour cela, a révélé que mon erreur principale était simplement que j'ai oublié de résumer la liste avant de faire l'appel récursif. Je suis convenablement embarrassé, s'il vous plaît essayez la nouvelle version et laissez-moi savoir si quelque chose ne va pas.



2
votes

À une réponse alternative, en particulier parce que vous effectuez des chiffres récursifs (base 10) SUM et par défaut montrent instance de base 10, vous pouvez aller-t'allonger via des chaînes et écrire bien avec un motif de vue , xxx

si la représentation de chaîne est un seul caractère (c.-à-d. 0 <= x <= 9 ), renvoyez simplement x , sinon recueille sur la somme des entiers de la représentation de chaîne.

Vous pouvez toujours utiliser des motifs d'affichage (IMO) bien sans rond-point, mais il exige que la fonction auxiliaire exprime un entier comme une liste de ses chiffres. , xxx


0 commentaires

3
votes

Un nombre positif et sa somme du chiffre sont toujours congruents modulo 9. De plus, étant donné que tous les nombres non nuls ont au moins un chiffre positif et aucun chiffre négatif, il n'ya aucun moyen d'obtenir une somme de 0 chiffre d'un nombre positif. Par conséquent: xxx

Essayez-le dans ghci: xxx

Cette fonction peut ne pas faire ce que vous attendez sur des nombres négatifs - mais alors, mais L'original ne gère pas non plus les nombres négatifs gracieusement, alors ... =)


0 commentaires