Ecrire les méthodes en récursivité
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

Ecrire les méthodes en récursivité



  1. #1
    Christina1414

    Ecrire les méthodes en récursivité


    ------

    Bonsoir,

    j'ai formulé un code ayant comme but d'implémenter une liste par tableau formé de plusieurs méthodes (j'ai introduit des commentaires indiquant chacune de ses méthodes) en
    utilisant le langage Java. Mais il y a quelques méthodes (j'ai indiqué lesquelles avec le mot recursive) que je dois les écrire en utilisant la récursivité. Si vous pouvez me guider en prenant comme exemple une méthode.
    Merci d'avance!

    Code:
    public class IntListType {
    
    		private final int DEFAULT_CAPACITY=10;
    		private final int RESIZE_FACTOR=2;
    		
    		private int[]list;
    		private int elements;
    		
    		public IntListType(){
    			list=new int[DEFAULT_CAPACITY];
    			elements=0;
    		}
    		
    		
    		//Redimensionnement du tableau
    		
    		public void resize(){
    			int newLength= list.length*RESIZE_FACTOR;
    			int[]tempList=new int[newLength];
    			for(int index=0;index<elements;index++){
    				tempList[index]=list[index];
    				list=tempList;
    			}
    		}
    		
    		//Determiner la taille du tableau 
    		
    		public int size(){
    			return elements;
    		}
    		
    		//Tester si la liste est vide
    		
    		public boolean isEmpty(){
    			return (elements==0);
    		}
    		
    		//Récupérer l'élément qui se trouve a la position index
    		
    		public int get (int index){
    			if(index>elements || index<0){
    				System.out.println("Index errone");
    				return 0;
    				}
    				return list[index];
    				
    		}
    		
    		//vider la liste
    		
    		public void clear(){
    			for(int index=0;index<elements;index++)
    				list[index]=0;
    				elements=0;
    		}
    		
    		//Ajout d'un élément a la fin de la liste
    		
    		public void add (int i){
    			if(elements==list.length)
    				resize();
    			
    			list[elements]=i;
    			elements++;
    		}
    		
    		//Ajout d'un élément a une position donnée dans la liste (RECURSIVE je l'ai déja fait)
    		
    		public void add (int i,int index,int index2){
    			
    			if(index>elements || index<0){
    				System.out.println("Index errone");
    				return;}
    			
    			if(elements==list.length){
    				resize();}
    			
    			if(index==index2){
    				list[index]=i;
    				elements++;
    			}
    			else
    				list[index2]=list[index2-1];
    				add(i,index,index2-1);
    				
    		}
    		
    		//Recherche d'un élément dans la liste (RECURSIVE?)
    		
    		public boolean contains (int i){
    			
    			int index=0;
    			boolean found=false;
    			
    			while(!found && index<elements){
    				if(list[index]==i)
    					found=true;
    					index++;
    			}
    			
    			return found;
    			
    		}
    		
    		//Récupérer l'index d'un élément(RECURSIVE?) 
    		
    		public int indexOf(int i){
    			int index=0;
    			boolean found=false;
    			
    			while(!found && index<elements){
    				if(list[index]==i)
    					found=true;
    				else
    					index++;
    			}
    			
    			if(!found)
    				index=-1;
    				return index;
    		}
    		
    		//Retirer un élément de la liste(RECURSIVE?)
    		
    		public boolean remove1 (int i){
    			int index=0;
    			boolean found=false;
    			while(!found && index<elements){
    				if(list[index]==i)
    					list[index]=0;
    					found=true;
    			}
    			index++;
    			if(found)
    			{
    				while(index<elements)
    				{
    					list[index-1]=list[index];
    					index++;
    				}
    				elements--;
    			}
    			return found;
    		}
    		
    		//Retirer un élément étant donné son index dans la liste
    		
    		public int remove (int index){   (RECURSIVE?)
    			
    			if(index>=elements||index<0){
    				System.out.println("Index errone");
    				return 0;
    		}
    			int temp=list[index];
    			list[index]=0;
    			index++;
    			while(index<elements){
    				list[index-1]=list[index];
    				index++;
    				
    			}
    			elements--;
    			
    			return temp;
    			
    		}
    		
    		public int set (int index, int i){
    			if(index>=elements || index<0){
    				System.out.println("Index errone");
    				return 0;
    			}
    			
    			int temp=list[index];
    			list[index]=i;
    			return temp;
    		}
    		
    		
    		
    }

    -----
    Dernière modification par Christina1414 ; 21/11/2015 à 18h13.

  2. #2
    imoca

    Re : Ecrire les méthodes en récursivité

    Bonjour,

    Code:
    		
    		public boolean contains (int i){
    			
    			int index=0;
    			boolean found=false;
    			
    			while(!found && index<elements){
    				if(list[index]==i)
    					found=true;
    					index++;
    			}
    			
    			return found;
    			
    		}
    Pour l'écrire de manière récursive,
    1/ Le test d'arrêt: si la liste est vide (elements==0) retourner false
    2/ On prend le premier élément (avec get(0)) on test si la valeur est bonne on retourne true sinon on appel la fonction contains avec l'argument i et sur la liste des "nombres suivant" (liste de départ privé de son premier élément).

  3. #3
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Code:
    		public boolean contains (int i,int index){
    			boolean found=false;
    			if(elements==0)
    				return false;
    			if(!found)
    				return true;
    			else
    				contains (i,index-1);
    				return found;
    		}
    C'est mieux de ne pas utiliser la méthode get car notre prof ne l'a pas demandé.
    C'est juste comme ca?

  4. #4
    imoca

    Re : Ecrire les méthodes en récursivité

    Code:
    	public boolean contains (int i,int index){
    			boolean found=false;
    			if(elements==0)
    				return false;
    			if(!found)
    				return true;
    			else
    				contains (i,index-1);
    				return found;
    		}
    Cette méthode renvoi false si elements==0 et true sinon. Ce n'est pas le bon résultat.
    De plus contains doit être appliqué sur un objet de la class IntListType.

  5. A voir en vidéo sur Futura
  6. #5
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Code:
    public boolean contains(int i,int index){
    			if(elements==0)
    				return false;
    			if(i==index)
    				return true;
    			else
    				list[index]=list[index-1];
    			return contains(i,index-1);
    		}
    C'est vrai maintenant?

  7. #6
    imoca

    Re : Ecrire les méthodes en récursivité

    Code:
    public boolean contains(int i,int index=0){
    			if(elements==index)
    				return false;
    			if(i==list[index])
    				return true;
    			else
    				return this.contains(i,index+1);
    		}
    Avec l'appel
    Code:
    boolean b=liste.contains(nombre);

  8. #7
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Ahh d'accord j'ai compris! Merci beaucoup
    Je l'ai écris sur eclipse, on ne peut pas initialiser index dans les paramètres donc : (c'est la meme chose)

    Code:
    public boolean contains(int i,int index){
    			index=0;
    			if(elements==index)
    				return false;
    			if(i==list[index])
    				return true;
    			else
    				return this.contains(i,index+1);
    		}
    Dernière modification par Christina1414 ; 22/11/2015 à 12h51.

  9. #8
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Concernant la méthode indexOf la méthode suivante est-elle vrai?

    Code:
    public int indexOf(int i,int index){
    			index=0;
    			if(index>elements)
    				return 0;
    			if(list[index]==i)
    				return index;
    			else
    				return indexOf(i,index+1);
    				
    		}

  10. #9
    imoca

    Re : Ecrire les méthodes en récursivité

    Citation Envoyé par Christina1414 Voir le message
    Ahh d'accord j'ai compris! Merci beaucoup
    Je l'ai écris sur eclipse, on ne peut pas initialiser index dans les paramètres donc : (c'est la meme chose)

    Code:
    public boolean contains(int i,int index){
    			index=0;
    			if(elements==index)
    				return false;
    			if(i==list[index])
    				return true;
    			else
    				return this.contains(i,index+1);
    		}
    Cela ne marche pas, enleve index=0;
    et ajoute lors de l'appel boolean b=liste.contains(nombre,0);

  11. #10
    imoca

    Re : Ecrire les méthodes en récursivité

    Citation Envoyé par Christina1414 Voir le message
    Concernant la méthode indexOf la méthode suivante est-elle vrai?

    Code:
    public int indexOf(int i,int index){
    			index=0;
    			if(index>elements)
    				return 0;
    			if(list[index]==i)
    				return index;
    			else
    				return indexOf(i,index+1);
    				
    		}
    Même problème, enleve index=0;
    De plus,
    Code:
    if(index>elements)
    				return 0;
    attention cela dit que si on ne trouve pas on renvoi 0, or si l'entier recherché est en problème est le premier la fonction renvoie également 0.
    remplace par
    Code:
    if(index>elements)
    				return -1;

  12. #11
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Concernant la méthode "remove" (la première) le code suivant est-il vrai? Merci beaucoup pour votre aide.

    Code:
    public boolean remove(int i, int index){
    			if(index>elements){
    				return false;
    				}
    			if(list[index]==i){
    				list[index]=0;
    				return true;
    			}
    			else{
    				return remove(i,index-1);
    				}
    				
    		}

  13. #12
    imoca

    Re : Ecrire les méthodes en récursivité

    Code:
    public boolean remove(int i, int index){
    			if(index>elements){
    				return false;
    				}
    			if(index==elements-1){
                                    elements=elements-1;
    				return true;
    			}
    			else{
                                    list[index]=list[index+1]
    				return this.remove(i,index+1);
    				}
    				
    		}

  14. #13
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Dernière question concernant la deuxième méthode remove..

    Je vous remercie pour votre temps!

    Code:
    public int remove1 (int index,int temp){
    			
    			temp=list[index];
    			
    			if(index>=elements || index<0){
    				System.out.println("Index errone");
    				return -1;
    				}
    			else  {
    				list[index+1]=list[index];
    				return remove1 (index+1,temp);
    				}
    		}

  15. #14
    imoca

    Re : Ecrire les méthodes en récursivité

    la variable temp n'est jamais utilisé.

  16. #15
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Ah oui pardonnez- moi je peux l'enlever et laisser le code sans le changer ou c'est mieux de l'utiliser?

  17. #16
    imoca

    Re : Ecrire les méthodes en récursivité

    Alors la fonction termine sur "Index errone".

  18. #17
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Voila le code suivant marche?

    Code:
    public int remove1(int index){
    		if(index>=elements || index<0){
    			System.out.println("Indexe errone");
    			return -1;}
    		if(index<elements){
    			list[index]=0;}
    		else{
    			return remove1(index+1);}
    			return index;
    			
    	}

  19. #18
    imoca

    Re : Ecrire les méthodes en récursivité

    Citation Envoyé par Christina1414 Voir le message
    Voila le code suivant marche?

    Code:
    public int remove1(int index){
    		if(index>=elements || index<0){
    			System.out.println("Indexe errone");
    			return -1;}
    		if(index<elements){
    			list[index]=0;}
    		else{
    			return remove1(index+1);}
    			return index;
    			
    	}
    La fonction va la plus part du temps va mettre le index-ieme terme à zero puis retourné index.

    Petite question: pourquoi ta liste se base sur un tableau et non pas sur une liste chainé. La nature récursive est naturelle
    Voici un code trouver sur le net.
    Code:
    public class Liste { /*Création de la classe liste chainée dynamique*/
        class Maillon{
            Object info; /*Information d'une donnée*/
            Maillon suiv; /*Information vers la donnée suivante*/
             
            /* Constructeur de la classe Maillon*/
            Maillon(Object i, Maillon s){
            info = i;
            suiv = s;
            }
        }
        protected Maillon premier;
        protected Maillon dernier;
        /* Constructeur de la classe Liste*/
        public  Liste(){
        premier = null; /*On a pasencore créé de référence*/
        }
        /*Méthode qui teste si la liste est vide*/
        public boolean vide(){
        return premier == null;
        }
        public void entree(Object i){
        /*On créé un nouveau maillon maillon*/
        Maillon p = new Maillon(i,null);
        if (premier==null){
            premier = p;
        }
        else{
            dernier.suiv=p; /*On fait pointer l'ancien dernier maillon  sur le nouveau nouveau maillon*/
        }
        dernier=p; /*On change la référence de dernier sur le dernier maillon*/
        }
         
        public Object sortir()throws Exception{
        if(vide()){
            throw new Exception("Liste vide");
        }
        Maillon res = premier;
        premier = premier.suiv;
        return res;
        }
        public String toString(){
            String chaine="Ma chaîne est : ";
            for (Maillon p = premier; p!=null ; p=p.suiv){
                chaine=chaine +String.valueOf(p.info)+"|";
            }
            return  chaine;
        }
        public static void main(String[] args){
            Liste ListeChaine = new Liste();       
            ListeChaine.entree("Test 1");
            ListeChaine.entree("Test 2");
            ListeChaine.entree("Test 3");
            ListeChaine.entree("Test 4");
            System.out.println(ListeChaine);
            try{
            ListeChaine.sortir();
            ListeChaine.sortir();
            }
            catch (Exception e)
            {
                System.out.println(e.getMessage());
            }
            System.out.println(ListeChaine);
        }
        }

  20. #19
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Notre prof nous a demandé de la faire en se basant sur un tableau on n'a pas encore appris les listes chainées.

  21. #20
    Christina1414

    Re : Ecrire les méthodes en récursivité

    Je peux ajouter un autre entier disons comme avant index2 et je dis que quand index=index2 on peut appliquer la méthode remove?

  22. #21
    imoca

    Re : Ecrire les méthodes en récursivité

    La méthode remove1(index) doit supprimer le terme en position index.
    On démarre en position i=index et l'on remplace list[i] par list[i+1] dans une boucle jusqu'à atteindre la fin de la liste. Puis éléments=éléments-1

    Récursivement le plus "simple" est de poussé les termes vers l'avant.
    Code:
    public void remove1(int index){
            if (index>-1 && index<elements-1){
                          this.list[index]=this.list[index+1];
                          this.remove1(index+1);
            }
            if(index==elements-1){
                       elements=elements-1;        
    }
    }
    Faire quelque test pour régler les conditions.
    Le principe est le suivant : list=[1,2,3,4,5] avec index=2
    alors le 1er appel retourne [1,2,4,4,5]
    puis [1,2,4,5,5], puis on décrémente elements [1,2,4,5] et l'on a supprimer la valeurs présente en position index.

Discussions similaires

  1. Récursivité et SQL
    Par haast dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 13/11/2014, 20h24
  2. la récursivité
    Par invitee2f3230c dans le forum Logiciel - Software - Open Source
    Réponses: 14
    Dernier message: 06/04/2010, 22h16
  3. récursivité, itération
    Par invite1acecc80 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 03/02/2010, 10h28
  4. Comment python gère-t-il la récursivité ?
    Par martini_bird dans le forum Logiciel - Software - Open Source
    Réponses: 26
    Dernier message: 14/11/2006, 01h00
  5. Intégrale et recursivité
    Par Olorin dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 17/01/2005, 11h22