Fonction récursive
Fermé
xman
-
Modifié par xman le 19/12/2012 à 19:17
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 21 déc. 2012 à 12:22
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 21 déc. 2012 à 12:22
A voir également:
- Fonction récursive
- Fonction si et - Guide
- Fonction si avec date ✓ - Forum Excel
- Ajout snap par la fonction - Forum Snapchat
- Fonction find vba - Astuces et Solutions
- Recherche dichotomique récursive c - Forum C
2 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
19 déc. 2012 à 19:46
19 déc. 2012 à 19:46
Ton problème se situe dans le fait que ton appel récursif est uniquement dans le cas où la lettre est une voyelle. Si c'est une consonne, tu arrêtes la fonction avec le résultat courant. En réalité tu comptes donc le nombre de voyelles au début du mot. si ton mot commence par une consonne alors ça donne 0.
Remarque : normalement une fonction récursive va toujours du cas le plus compliqué vers le cas le plus simple, tu ne devrais donc pas avoir nbv(i+1,ch); mais nbv(i-1,ch); ce qui tendrait à partir du caractère length(ch) pour progressivement diminuer la complexité et faire un test sur 0, plutôt que "compter" à chaque fois la taille de ch...
function nbv(i:integer;ch:string):integer;
var n:integer;
begin
n:=0;
if(i<=length(ch))
then begin
if (upcase(ch[i]) in ['A','E','U','I','O','Y'])
then n:=n+1;
n := n+nbv(i+1,ch);
end;
nbv:=n;
end;
Remarque : normalement une fonction récursive va toujours du cas le plus compliqué vers le cas le plus simple, tu ne devrais donc pas avoir nbv(i+1,ch); mais nbv(i-1,ch); ce qui tendrait à partir du caractère length(ch) pour progressivement diminuer la complexité et faire un test sur 0, plutôt que "compter" à chaque fois la taille de ch...
function nbv(i:integer;ch:string):integer;
begin
if (i=0)
then result:=0
else if (upcase(ch[i]) in ['A','E','U','I','O','Y'])
then result:= 1+nbv(i-1,ch)
else result:= nbv(i-1,ch);
end;
ccm81
Messages postés
10544
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
18 mars 2023
2 336
21 déc. 2012 à 12:15
21 déc. 2012 à 12:15
Bonjour
Une remarque: le paramètre i n'est pas vraiment indispensable ici
bonne journée
Une remarque: le paramètre i n'est pas vraiment indispensable ici
function nbv(ch:string):word;
begin
if ch = ''
then nbv := 0
else
if upcase(ch[1]) in ['A','E','I','O','U','Y']
then nbv := 1+nbv(copy(ch,2,length(ch)-1)
else nbv := nbv(copy(ch,2,length(ch)-1);
end;
bonne journée
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
Modifié par KX le 21/12/2012 à 12:33
Modifié par KX le 21/12/2012 à 12:33
Je suis d'accord sur le principe, mais ça nécessite de faire des copy alors qu'on peut s'en passer.
Il est plus simple d'avoir une deuxième fonction qui appelle la première :
D'ailleurs en Pascal on pourrait mettre les deux fonctions en une seule en utilisant la première fonction comme fonction auxiliaire de la deuxième (à utiliser avec parcimonie) :
Il est plus simple d'avoir une deuxième fonction qui appelle la première :
function nbv(ch:string):integer;
begin
result := nbv(length(ch),ch);
end;
D'ailleurs en Pascal on pourrait mettre les deux fonctions en une seule en utilisant la première fonction comme fonction auxiliaire de la deuxième (à utiliser avec parcimonie) :
function nbv(ch:string):integer;
function aux(i:integer;ch:string):integer;
begin
if (i=0)
then result:=0
else if (upcase(ch[i]) in ['A','E','U','I','O','Y'])
then result:= 1+aux(i-1,ch)
else result:= aux(i-1,ch);
end;
begin
result := aux(length(ch),ch);
end;