IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

transformation d'une boucle en fonction récursive


Sujet :

Langage Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut transformation d'une boucle en fonction récursive
    Tout est dans le titre.

    J'essaie de transformer une fonction itérative en fonction récursive mais je bloque vraiment depuis un moment.

    Voici mon programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class ITRF2004 {
    	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
     
    	int getA() throws NumberFormatException, IOException
    	{
    		System.out.printf("\n valeur de A :");
    		int A = Integer.parseInt(in.readLine());
    		return A;
    	}
     
    	int getB() throws NumberFormatException, IOException
    	{
    		System.out.printf("\n valeur de B :");
    		int B = Integer.parseInt(in.readLine());
    		return B;
    	}
     
    	int calcul(int A, int B) throws NumberFormatException, IOException
    	{
    		int x, y;
    		x = A;
    		y = 1;
    		while (y < B)
    		{
    			if ((B / y) >= 2)
    			{
    				x = x * x;
    				y = 2 * y;
    			} else
    			{
    				x = x * A;
    				y++;
    			}
    			System.out.printf("x= %d, y= %d\n", x, y);
    		}
    		return x;
    	}
     
    	public static void main(String [] args) throws NumberFormatException, IOException
    	{
    		ITRF2004 it = new ITRF2004();
    		int A, B, y;
    		A = it.getA();
    		B = it.getB();
    		System.out.printf("\n\n Le résultat est %d", it.calcul(A, B));
    	}
    }
    En règle générale, en récursivité, il y a une base. Or, ici, je ne la trouve pas.

    Au départ, j'ai pensé à y<B et ai déclaré if (y>=B) return x; mais ça bloque le programme au bout d'un essai et me donne tout de suite le premier résultat.

    De plus, si la fonction s'appelle elle-même, y est toujours réinitialisé à 1, ce qui n'est pas bon. J'en conclus qu'il faut le sortir de la fonction pour qu'il soit initialisé une première fois puis, en appelant la fonction, qu'il augmente.

    Donc, voilà, je cogite, je cogite, mais je ne trouve pas encore la solution.

    Quelqu'un aurait-il une petite idée pour me faire avancer?

    Merci par avance,
    Johnny

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tout d'abord, trouver ce que doit renvoyer la fonction récursive. Ici, c'est "x".
    Ensuite, la condition d'arrêt de la récursion :
    Enfin, ce que va calculer la récursion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ((B / y) >= 2)
    {
    	x = x * x;
    	y = 2 * y;
    } else
    {
    	x = x * A;
    	y++;
    }
    Enfin, les paramètres à transmettre à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calculRecursif( int x, int y, int A, int B )
    Il faut construire une méthode public, avec la même signature que la fonction itérative, et une méthode privée, qui aura la signature décrite ci-dessus.
    Le code final donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public int calRec( int A, int B )
    {
    	return calculRecursif( A, 1, A, B );
    }
     
    private int calculRecursif( int x, int y, int A, int B )
    {
    	System.out.printf("x= %d, y= %d\n", x, y);
     
    	if( y >= B )
    	{
    		return x;
    	}
    	else
    	{
    		if( B >= 2 * y )
    		{
    			return calculRecursif( x * x, y * 2, A, B );
    		}
    		else
    		{
    			return calculRecursif( x * A, y + 1, A, B );
    		}
    	}
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    Merci!

    J'avais trouvé cela qui ne fonctionnait que dans certains cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class ITRF2004 {
    	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
     
    	int getA() throws NumberFormatException, IOException
    	{
    		System.out.printf("\nvaleur de A :");
    		int A = Integer.parseInt(in.readLine());
    		return A;
    	}
     
    	int getB() throws NumberFormatException, IOException
    	{
    		System.out.printf("\nvaleur de B :");
    		int B = Integer.parseInt(in.readLine());
    		return B;
    	}
     
    	int calculIteratif(int A, int B, int y) throws NumberFormatException, IOException
    	{
    		int x;
    		x = A;
    		while (y < B)
    		{
    			if ((B / y) >= 2)
    			{
    				x = x * x;
    				y = 2 * y;
    			} else
    			{
    				x = x * A;
    				y++;
    			}
    			System.out.printf("x= %d, y= %d\n", x, y);
    		}
    		return x;
    	}
     
    	int calculRecursif(int A, int B, int y) throws NumberFormatException, IOException
    	{
    		int x;
    		x = A;
    		if (y>=B) return x;
    		while (y < B)
    		{
    			if ((B / y) >= 2)
    			{
    				return calculRecursif (x*x, B, 2*y);
    			} else
    			{
    				return calculRecursif (x*A, B, y+1);
    			}
    		}
    		System.out.printf("\nx= %d, y= %d\n", x, y);
    		return x;
    	}
     
    	public static void main(String [] args) throws NumberFormatException, IOException
    	{
    		ITRF2004 it = new ITRF2004();
    		int A, B, y;
    		A = it.getA();
    		B = it.getB();
    		y = 1;
    		System.out.printf("\n\nLe résultat est %d", it.calculIteratif(A, B, y));
    		System.out.printf("\n\nLe résultat est %d", it.calculRecursif(A, B, y));
    	}
    }
    Décidément, j'ai encore du boulot en récursivité. Merci pour l'aide, j'apprécie, car je n'aurai jamais le corrigé (c'est un exercice d'une annale ITRF de 2004, concours que je prépare pour la première fois cette année)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creer une boucle en fonction du temps
    Par tdmort dans le forum Visual C++
    Réponses: 2
    Dernier message: 02/05/2012, 20h58
  2. calcul des extrémités d'une boucle par fonction
    Par polo92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/12/2011, 15h13
  3. [MySQL] Fonction récursive dans une boucle
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/02/2008, 12h18
  4. Réponses: 2
    Dernier message: 28/08/2006, 13h16
  5. Sortir d'une boucle en fonction d'une durée
    Par BECHE dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2005, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo