Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 1188
Réponses : 13
Type : discussion
Etat : réponses autorisées

Declarer une fonction

pasdepsedo le 08/12/2009 à 19:49
Voila je me demandais comment fait-on pour déclarer une fonction comme dans le C...
J'en aurais besoin car je veux faire un programme sur la fonction d'ackermann, une fonction recursive qui s'écrit comme cela en C:

int ackermann(m,n)
if n==0 then
return m+1
elseif m==0 then
return ackermann(n-1,1)
else
return ackermann(n-1,ackermann(n,m-1))
merci !!!
Wirekey le 09/12/2009 à 17:08
Hum.. Jconnais pas le C ^^

Mais bon



Je comprend pas non plus ca ^^ notgood.gif

Explique le déroulement de ca fonction stp

m et n son des entier que tu doit rentrer ?
sypotu le 09/12/2009 à 17:17
en basic pas besoin de déclarer la variable winkle.gif
en C ta variable est un tableau (il y a 2 valeurs)?
Wirekey le 09/12/2009 à 17:40
non en C ta variable est une variable normale jcrois ( il y a différent type float pour les reels int les entiers ... )

Pour moi sont programme resemblerais a :

Code
Input "M Un entier",M
Input "N Un entier",N
If partDéc(M) != 0 ou partDéc(N) !=0
Then
Disp "M OU N NON-ENTIER
Stop
End
If M=0
Disp "A(m,n)=",N+1
If M>0 et N=0
Disp "A(M,N)=A(M-1,1)
If M>0 et N>0
Disp "A(M,N)=","A(M-1,A(M,N-1))
Pasdepsedo le 09/12/2009 à 22:16
En fait c'est une fonction assez compliquée...
C'est une fonction à deux variables, des entiers positifs.
Elle est dite récursive car on doit l'utiliser a plusieurs reprises pour trouver la solution...
Exemple:
f(0,1) = 2 (par definition si m=0 alors la solution est n+1)
f(1,0) = f(0,1) = 2 (la encore par définition si n=0 f(m,n) = f(m-1,1) )
Maintenant un peu plus compliqué:
f(1,1) = f(0, f(1, 0)) (selon la troisieme règle) = f(0,2) = 3 (selon la 1ere regle...)
Maintenant beaucoup plus chaud:
f(2,2) = f(1, f(2, 1)) = f(1, f(1, f(2, 0))) = f(1, f(1, f(1,1))) = f(1, f(1, 3)) = f(1, f(0, f(1,2)))
= f(1, f(0, f(0, f(1,1)))) = f(1, f(0, f(0, 3))) = f(1, f(0, 4)) = f(1, 5) = f(0, f(1, 4))
= f(0, f(0, f(1,3))) = f(0, f(0, f(0, f(1, 2)))) = f(0, f(0, f(0, f(0, f(1,1))))) =
f(0, f(0, f(0, f(0, 3)))) = f(0, f(0, f(0, 4))) = f(0, f(0, 5)) = f(0,6) = 7 (ouf !!!)
Bravo a ceux qui ont tout suivi et encore plus a ceux qui ont tout compris...
Vous comprenez maintenant le terme de fonction recursive...
Pour culture le nombre f(3,3) est incalculable pour un humain sans se gourer quelque part, et
le nombre f(10,10) est tellement grand qu'il est impossible à écrire sous forme exacte sur du papier...
Utile si vous voulez impressionner votre prof de math à partir de la seconde... (au college personne ne pige et même les profs ne la connaissent peut-etre pas (ca dépend de certains))
Donc pour revenir a ma question si quelqu'un connait le C est ce que l'on peut établir une fonction en langage TI ? Cela m'etonnerai beaucoup que l'on puisse programmer cette fonction seulement avec de lbl et des boucles...
sypotu le 09/12/2009 à 22:38
j'essaierait ça :

Alors là !
j'ai compris mais ce sera difficile a faire en basic...
J'y réfléchis...
Wirekey le 10/12/2009 à 22:17
Hum ...

Jpense que c'est possible mais qu'il faudra :

De la mémoire
Des piles
De la patiente
...

Il faudrait déjà poser M et N <10 sinon on sera vite en dehors de la capaciter de la calculette notgood.gif

Je me penche dessus samedi
Pasdepsedo le 10/12/2009 à 23:33
Oui mais surtout m < 5 : c'est m qui rend la fonction exponantielle. Sinon f(10,10) pour donner un ordre d'idee si on voulait le mettre sur un fichier texte il faudrait 10^(factorielle du nombre d'atomes dans l'univers) Teraoctets... Le truc impossible quoi...
En fait l'avantage dans le C pour ceux qui ne connAissent pas c'est qu'on peut en très peu de lignes rédiger une fonction que l'on peut réutiliser plusieurs fois sans avoir à la réecrire...

On doit d'abord définir la fonction:
int f(m,n) -- on crée la fonction
if m=0 -- on énonce les règles
return n+1 -- return est le nombre qui va etre "renvoyé" dans une variable en fonction des paramètres de la
fonction
elseif n=0
return f(m-1, 1) -- on demande si n=0 de remonter en haut de la fonction en remplacant m par m-1 et n par 1
else
return f(0,f(m,n-1) -- meme chose

En C on utilise une fonction comme ceci:
int variable = f(2,2)
les nombres 2,2 vont passer plusieurs fois à la machine à laver jusqu'a ce que l'on tombe sur un entier, (ici 7) qui sera mis dans la variable par un "return"
En fait je me demandais si ce "raccourci" n'existe pas en TI Basic...
sypotu le 11/12/2009 à 19:04
je suis en train de faire un programme...
comment passes tu de f(1,f(1,f(1,1))) à f(1,f(1,3)) ???
sypotu le 11/12/2009 à 19:12
dsl j'ai trouvé
sypotu le 11/12/2009 à 23:05
Voilà :
Code
Prompt M
Prompt N
1->A
A->dim(Liste 1
For(B,1,9^99
If M=0:Then
N+1->N
A-1->A
If A<1:Goto F
Liste 1(A)->M
Else
If N=0:Then
M-1->M
1->N
Else
M-1->Liste 1(A
A+1->A
N-1->N
End
End
End
Lbl F
Disp N

c'est un peu long mais f(3,3)=61 !!!
dysto le 12/12/2009 à 08:43
Et beh, si ça marche vraiment bien un grand bravo sypotu !!!
(Moi perso j'avais absolument rien pigé à sa demande xDDD !)
Pasdepsedo le 12/12/2009 à 21:35
Merci beaucoup ! J'ai été un peu rebuté au début devant l'apparante complexité de la fonction mais finalement ca tiens en peu de lignes... Si j'ai bien compris A c'est le nombre de "fonctions imbriquées" les unes dans les autres et la liste stocke les nombres qui correspondent au différentes imbrications ?
genre f=(0,f(1,f(1,2)
Si j'ai bien compris A vaut 3 et la liste contient: 0,1,1 et N vaut 2...
sypotu le 13/12/2009 à 08:25
ouai c'est ça
juste le dernier m n'est pas dans la liste mais dans la variable M