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

Caml Discussion :

Incompréhension sur le retour d'une fonction récursive


Sujet :

Caml

  1. #1
    Invité
    Invité(e)
    Par défaut Incompréhension sur le retour d'une fonction récursive
    Bonjour,
    Sur ce code qui détecte si un item est un palindrome ou non:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # let rec palindrome(s) = 
        let lenItem = String.length(s) in 
            if lenItem <= 1 then true else 
            if s.[0] = s.[lenItem - 1]
            then palindrome(String.sub(s)(1)(lenItem - 2)) 
            else false;;

    si je trace palindrome sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # palindrome("sages");;
    ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    palindrome <-- "sages"
    palindrome <-- "age"
    palindrome --> false
    palindrome --> false
    - : bool = false
    Je ne comprends pas pourquoi le premier retour est faux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    if s.[0] = s.[lenItem - 1]
    then palindrome(String.sub(s)(1)(lenItem - 2))
    ...
    "s" et bien égal à "s" on peut donc passer à la sous chaîne suivante et comparer "a" et "g" qui pour le coup ne sont pas égaux.
    Pour un résultat identique j'ai une variante avec cette fois des opérateurs booléens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # let rec palindrome(s) =
        let lenItem = String.length(s) in
            (lenItem <= 1) ||
            (s.[0] = s.[lenItem -1]) &&
            (palindrome(String.sub(s)(1)(lenItem -2)));;
    Et j'avoue que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    (s.[0] = s.[lenItem -1]) &&
    (palindrome(String.sub(s)(1)(lenItem -2)));;
    ...
    qui code que les deux expressions sont vraies simultanément me laisse plus que dubitative...

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Je ne comprends pas bien ce qui te fait douter, toutes tes propositions sont correctes (même si ce n'est pas tout à fait ce qu'écrirait un expert).

    palindrome "sages" retourne faux parce que palindrome "age" retourne faux.

    Je pense qu'un expert aurait écrit quelque chose comme ceci :

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec palindrome s low high =
      low >= high || (s.[low] = s.[high] && palindrome s (low+1) (high-1))
     
    let palindrome s =
      palindrome s 0 (String.length s - 1);;
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    palindrome "sages" retourne faux parce que palindrome "age" retourne faux.
    Évidemment,... je crois que mes neurones ont du mal à boucler dans la recursivité...
    En tous cas merci pour ton salutaire déclic.

    Citation Envoyé par SpiceGuid Voir le message

    Je pense qu'un expert aurait écrit quelque chose comme ceci :

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec palindrome s low high =
      low >= high || (s.[low] = s.[high] && palindrome s (low+1) (high-1))
     
    let palindrome s =
      palindrome s 0 (String.length s - 1);;

    J'aime bien, surtout low et high,... très classe.
    Je te les pique:

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # let palindrome(s) = 
            let rec build(low)(high) = 
                low >= high || (s.[low] = s.[high] && build(low + 1)(high - 1)) in
            build(0)(String.length(s) -1);;

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

Discussions similaires

  1. Bloqué sur une fonction récursive
    Par InfoMatlab dans le forum Maple
    Réponses: 0
    Dernier message: 19/11/2013, 01h59
  2. problème sur une Fonction récursive
    Par bernie74 dans le forum Développement
    Réponses: 4
    Dernier message: 21/11/2011, 12h45
  3. Réponses: 2
    Dernier message: 10/12/2008, 02h10
  4. [POO] Bug sur une fonction récursive : renvoit undefined
    Par zaboug dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/06/2008, 14h10
  5. reference sur le retour d'une fonction
    Par yan dans le forum C++
    Réponses: 7
    Dernier message: 21/11/2007, 16h42

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