J'ai encore un problème . J'ai ce truc à faire. Mais je peux pas entrer cette fonction car il m'indique une synthaxe erreur sur le else donc je ne peux pas tracer l'exécution. Comment je dois faire? Excuse moi pour toutes ces questions
Version imprimable
J'ai encore un problème . J'ai ce truc à faire. Mais je peux pas entrer cette fonction car il m'indique une synthaxe erreur sur le else donc je ne peux pas tracer l'exécution. Comment je dois faire? Excuse moi pour toutes ces questions
fais l'effort de recopier le morceau du sujet, et le code... ;)
On veut compter le nombre de fois qu’apparaît la chaîne ”00” dans une chaîne donnée.
L’énoncé ci-dessous est une description de ce calcul.
occur(y) =0 si y=""
1 + occur(cdr(cdr(y)) si x="00"
occur(cdr(y)) sinon
où x est une sous chaîne extraite de y à partir de sa première position.
Une réalisation possible de cet énoncé par un programme Ocaml est :
Ce programme ne fait pas ce qu’il est censé faire. On vous demande de le corriger. PourCode:
1
2
3
4
5
6 # let rec occur y = match y with "" -> 0 | _ -> let ch1 = cdr y in let ch2 = cdr ch1 in if String.sub y 0 2 = "00" then 1 + occur ch2 else occur ch1 ;;
cela on peut s’aider de la commande trace.
1. tracer l’execution de occur "120004009";; comme suit :
# #trace occur;;
# occur "120004009";;
2. Combien de fois la fonction occur est-elle appelée ?
3. Décrire l’étape de calcul du dernier appel de la fonction, c’est à dire remplacer y par ”9”
dans occur et en déduire l’erreur.
4. Corriger la fonction occur
as-tu essayé de parenthèser ?
Oui j'obtiens celaCode:
1
2
3
4
5
6
7
8
9
10 # let rec occur y = match y with "" -> 0 | _ -> let ch1 = cdr y in (let ch2 = cdr ch1) in (if (String.sub y 0 2 = "00" then 1 + occur ch2)) else (occur ch1) ;; Characters 46-50: else (occur ch1) ;; ^^^^ Syntax error
Code:
1
2
3
4
5
6 # let rec occur y = match y with "" -> 0 | _ -> let ch1 = cdr y in let ch2 = cdr ch1 in if ( String.sub y 0 2 = "00" ) then ( 1 + occur ch2 ) else ( occur ch1 ) ;;
au passage cdr, ça fait un peu lisp... :P
Toujours l'erreurCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # let rec occur y = match y with "" -> 0 | _ -> let ch1 = cdr y in let ch2 = cdr ch1 in if ( String.sub y 0 2 = "00" ) then ( 1 + occur ch2 ) else ( occur ch1 ) ;; Characters 83-87: else ( occur ch1 ) ;; ^^^^ Syntax error # let rec occur y = match y with else ( occur ch1 ) ;;
Si ça ne fonctionne pas alors quitte l'interpréteur et recommence, copie le code dans le clipboard et colle-le dans ton interpréteur.
Aide pour l'exercice: j'imagine qu'un cdr n'est valide que sous la condition que tu sais.Code:
1
2
3
4
5
6
7 # let rec occur y = match y with |"" -> 0 | _ -> let ch1 = cdr y in let ch2 = cdr ch1 in if ( String.sub y 0 2 = "00" ) then 1 + occur ch2 else occur ch1 ;; val occur : string -> int = <fun>
Tu es en train de copier un programme Lisp dans l'interpréteur Caml... c'est un peu normal que ça ne marche pas, non ?
N'oublie pas une chose : on peut écrire des programmes, sur le papier, en pseudo-langage, et c'était peut-être là l'intention de la personne qui a fait l'énoncé.