CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

help récursivité java

ScottBrendo
ScottBrendo
Niveau 7
13 décembre 2014 à 12:49:48

Bonjour, j'essaie de compter le nombre de noeud d'un arbre n-aire en java :
Alors le programme m'affiche bien les noeuds, mais mon compteur nb m'affiche 1, en fait j'ai l'impression qu'il me remet le compteur à 0 à chaque quoi , vu que je l'ai initialisé tout en haut du code. Comment faire ?
Par avance merci



public static int noeud(ArbreN a){
        int nb = 0;
        if(a != null){

            if(!a.fils.isEmpty()){ // Si les fils ne sont pas vide
                ArrayList<ArbreN> fils = a.fils;

                System.out.println("noeud :"+a.racine );
                nb = nb + 1;

                while(!fils.isEmpty()){ // Je parcours les fils
                    noeud(fils.get(0));
                    fils.remove(0);
                }

                return nb;
            }else{
                return nb;
            }
        }else{
            return -1;
        }
    }

FortCommeMeric
FortCommeMeric
Niveau 10
13 décembre 2014 à 13:10:20

Bon déjà un petit conseil général sur ton code, essaie de ne jamais mettre TOUT ton code dans un if ça le rend illisible.

Au lieu de faire

if (!condition)
{
    /* code */
}
else
{
    return code;
}

Tu devrais traiter les cas dégénérés en premier comme ça :

if (condition)
    return code;

/* code */

bref revenons a ton problème :

en fait tu n'utilise pas la valeur de retour de ta fonction noeud.

Ta fonction retourne le nombre de noeuds de l'arbre passé en argument.
Un arbre a combien de nœuds ? Déjà il y a la racine donc ça fait 1, plus pour chaque fils le nombre de nœud que comporte l'arbre dont la racine est ce fils. Donc dans ton cas on aura un truc du genre :

int nb = 1;

for (ArbreN fils : a.fils)
    nb += noeud(fils);

return nb;
ScottBrendo
ScottBrendo
Niveau 7
13 décembre 2014 à 15:51:46

Merci pour tes conseils et de ta réponse. Voilà le résultat qui fonctionne : cimer chef !


public static int noeud(ArbreN a){
        int nb = 1;
            for (ArbreN fils : a.fils){
                if(!fils.fils.isEmpty()) {
                    nb += noeud(fils);
                }else{
                    nb = noeud(fils);
                }
            }
        return nb;
    }
FortCommeMeric
FortCommeMeric
Niveau 10
13 décembre 2014 à 15:57:49

Pourquoi tu teste si le fils a des fils ? tu peux tout simplement retirer ce test et ne garder que

for (ArbreN fils : a.fils)
    nb += noeud(fils);

Si tu appelle la fonction sur un arbre sans aucun fils, la fonction va renvoyer 1 (la racine) et c'est ce qu'on veut

ScottBrendo
ScottBrendo
Niveau 7
13 décembre 2014 à 16:05:55

J'ai un arbre de 10 éléments si j'enlève ma condition, il me renvoie le nombre d'élément. Pour moi un noeud c'est un arbre qui a des fils, donc je test si cet arbre a encore des fils.

voila ma classe ArbreN :
public class ArbreN { private int racine; private ArrayList<ArbreN> fils; public ArbreN(int racine){ this.racine = racine; this.fils = new ArrayList<ArbreN>(); }

FortCommeMeric
FortCommeMeric
Niveau 10
13 décembre 2014 à 16:29:17

Franchement je suis pas sûr que ça marche ta technique, t'as essayé sur quoi comme exemple ? Parce que

else
    nb = noeud(fils);

remet nb a 1 forcément donc tu perd tout ce que tu as compté avant.

Si tu veux compter tous les nœuds sauf les feuilles tu peux faire comme ça :

public static int noeud(ArbreN a){
    if (a.fils.isEmpty())
        return 0;

    int nb = 1;

    for (ArbreN fils : a.fils)
        nb += noeud(fils);

    return nb;
    }
ScottBrendo
ScottBrendo
Niveau 7
13 décembre 2014 à 16:34:57

J'ai bien 5 noeuds dans mon arbre, et il me renvoie 5, donc ça à l'air de fonctionner. Mais merci ta méthode fonctionne très bien et elle m'a l'air plus clair.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment