Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/01/2007, à 12:59

reaver

Caml : programmation de la fonction puissance.

Bonjour,
j'ai tenté de programmer la fonction puissance, mais mon programme ne marche pas.
Voilà ce que j'ai fais :
# let rec f x  = function
  |0 -> 1
  |1 -> x
  |n -> x*(f x (n-1));;
val f : int -> int -> int = <fun>
# f 2 3;;
Stack overflow during evaluation (looping recursion?).

Quelle est donc mon erreur ?
Merci d'avance.

Hors ligne

#2 Le 02/01/2007, à 13:50

Bobbybionic

Re : Caml : programmation de la fonction puissance.

Bonjour

Tiens du Caml ça fait longtemps...

Je suis rouillé mais j'essaye de comprendre wink

let rec f x  = function

Il n'y a qu'un argument ?

Sinon après je ne me souviens plus comment fonctionne la comparaison, mais j'ai un doute là dessus...


Non à la vente liée. Non au monopole Windows.
Tous ensemble, refusons les logiciels préinstallés et tournons nous vers le libre.

http://bobbybionic.wordpress.com

Hors ligne

#3 Le 02/01/2007, à 14:30

larrystourne

Re : Caml : programmation de la fonction puissance.

Bonjour

      En testant sous ocaml la fonction marche sans problème sauf pour des grandes valeurs (10¹° par exemple ) où elle renvoie des nombres négatifs ou bien 0.


      Sinon c'est bizarre que pour 2³ la pile soit pleine...

Hors ligne

#4 Le 02/01/2007, à 14:55

Hiéroglyphe

Re : Caml : programmation de la fonction puissance.

Moi je coderai plutôt quelque chose comme:

let rec f x n = match n with
| 0 -> 1
| _ -> x * (f x (n-1))
;;

Hors ligne

#5 Le 02/01/2007, à 15:00

Bobbybionic

Re : Caml : programmation de la fonction puissance.

Ah Hiéroglyphe ça fait plaisir de revoir un peu de Caml smile

Le bon vieux match, il me manque en Lada (euh pardon, Ada big_smile)...


Non à la vente liée. Non au monopole Windows.
Tous ensemble, refusons les logiciels préinstallés et tournons nous vers le libre.

http://bobbybionic.wordpress.com

Hors ligne

#6 Le 02/01/2007, à 15:08

reaver

Re : Caml : programmation de la fonction puissance.

Ben si le programme marche pour toi larrystourne, je devrais pas avoir un problème au niveau de mon caml ?
En fait hiéroglyphe, c'est exactement pareil de programmer la récursivité de ma manière ou de la tienne:)

Reaver

Hors ligne

#7 Le 02/01/2007, à 16:15

Freddy

Re : Caml : programmation de la fonction puissance.

Mmmh... Ici aussi, avec un Camllight 0.75 compilé depuis les sources, la fonction marche très bien...
D'ailleurs je ne vois pas pour quelle raison cette fonction pourrait déborder la pile.


There is no system but GNU, and Linux is one of its kernels.

Hors ligne

#8 Le 02/01/2007, à 17:16

reaver

Re : Caml : programmation de la fonction puissance.

je suis sûr que c'est dû à mon caml.
Vous pouvez me proposer un site d'où je peux télécharger Caml (qui sois bien tongue)
En prépas, on utilise quel type de caml : Ocaml, caml, caml light ?

Hors ligne

#9 Le 03/01/2007, à 10:00

Hiéroglyphe

Re : Caml : programmation de la fonction puissance.

Pour info, ça déborde aussi chez moi et c'est normal: le type Int étant limité à 2^32; au dela, il faut utiliser le module Int64:

open Int64;;

let rec f64 x n =
  if  n = 0 then 1L else Int64.mul (Int64.of_int x)  (f64 x (n - 1))
;;

Ca débordera aussi... mais plus tard wink


En prépas, on utilise quel type de caml : Ocaml, caml, caml light ?

Pour ma pomme, en fac, c'est Ocaml.

Sinon Je te conseille aussi de récupérer le paquet "tuareg-mode", qui te permet de compiler directement, ligne à ligne, ton programme dans Emacs: super pratique! (d'ailleurs si quelqu'un connait un équivalent sous VIM, ça m'intéresse grave)

Dernière modification par Hiéroglyphe (Le 03/01/2007, à 10:29)

Hors ligne

#10 Le 03/01/2007, à 14:46

reaver

Re : Caml : programmation de la fonction puissance.

Oui mais 2^32 est biennnn supérieur à 2^3;; donc sans ouvrir Int64 il aurait pu m'afficher le résultat

Hors ligne

#11 Le 03/01/2007, à 15:45

Freddy

Re : Caml : programmation de la fonction puissance.

En prépa, c'est Caml Light, qui n'existe pas sur les dépôts officiels. Va sur caml.inria.fr, tu télécharges les sources de Camllight, la compilation se fait en suivant les instructions dans INSTALL.
Je crois que la seule subtilité est d'éditer le Makefile pour la copie des pages de man. Il faut avoir aux environs de la ligne 30 ou 40 :

# The directory where the manual pages will be installed
MANDIR=/usr/share/man/man$(MANEXT)

Hiéroglyphe > Si pour le calcul de 2³ = 8 il y a besoin des entiers longs...
Au fait : pour les entiers sous Camllight 0.75, sous platforme 32bits, le type entier est limité à 2^31 (les valeurs représentables vont de -2^30 à 2^30 - 1). Dans la représentation des entiers, il y a un bit qui sert à représenter je ne sais plus quoi.


There is no system but GNU, and Linux is one of its kernels.

Hors ligne

#12 Le 03/01/2007, à 17:19

Bobbybionic

Re : Caml : programmation de la fonction puissance.

Dans la représentation des entiers, il y a un bit qui sert à représenter je ne sais plus quoi.

Le signe non ?


Non à la vente liée. Non au monopole Windows.
Tous ensemble, refusons les logiciels préinstallés et tournons nous vers le libre.

http://bobbybionic.wordpress.com

Hors ligne

#13 Le 03/01/2007, à 21:24

Freddy

Re : Caml : programmation de la fonction puissance.

Non, les entiers sont représentés en mode complément à deux.
Et si le 32ième bit était utilisé pour représenter le signe, alors les entiers iraient de -2^31 +1 à 2^31 - 1, ce qui fait deux fois plus (enfin presque).

Voilà, j'ai retrouvé où est passé le dernier bit :

La « procédure » Random.bits est une fonction qui a pour argument () et qui renvoie une suite de bits aléatoires sous la forme d'un entier (les entiers Ocaml sont codés sur 31 bits, afin d'exploiter le bit restant pour différencier valeurs immédiates de pointeurs lors de la récupération automatique de mémoire).
http://web.archive.org/web/20060308030714/lancelot.pecquet.org/download/articles/ocaml/ocaml.html

J'avoue n'avoir strictement rien compris à l'explication. Mais je sais que les entiers sont codés sur 31 bits sur une architecture 32 bits.


There is no system but GNU, and Linux is one of its kernels.

Hors ligne