2013-01-10 10 views
2

-je un noobie avec OCaml, mes problèmes est de savoir comment obtenir le chiffre d'un nombre entier OCaml et comment les mettre dans une liste par des appels récursifsOCaml mettre un entier dans une liste

des chiffres de la fonction OCaml: int - > int list qui prend un entier n comme argument et si l'entier est positif, renvoie la liste des chiffres de n dans l'ordre dans lequel ils apparaissent n -à-dire:

# digits 3124;; 
- : int list = [3;1;2;4] 


# let rec digits n = 
    if n >0 then digits(n/10)::[] 
    else [];; 

Répondre

3

Si vous écrivez digits directement une fonction récursive, vous aurez du mal à imprimer les chiffres dans le bon ordre sans inverser toute la liste à la fin ou ajouter des éléments à la La fin de la liste actuelle (les deux approches inefficaces).

C'est mieux fait avec une fonction récursive terminale intermédiaire:

let digits2 d = 
    let rec dig acc d = 
     if d < 10 then d::acc 
     else dig ((d mod 10)::acc) (d/10) in 
    dig [] d 
;; 

Ici, prend un accumulateur qui est utilisé pour construire la liste et est passé sur le prochain appel récursif et est retourné dans son ensemble à la fin (sauf pour les inconvénients de d ici). Ceci est un modèle assez commun lors de l'écriture des fonctions récursives du terminal.

Il peut prendre un peu de temps pour s'habituer à ce style d'écriture, mais finalement il viendra. Essayer de réécrire des fonctions simples comme celle-ci est à mon avis un bon moyen de s'entraîner.

1

À des fins d'apprentissage, il peut être utile de terminer le code d'origine de l'OP au lieu de passer à l'utilisation d'un accumulateur. L'élément clé manquant est qu'il ne combine pas le chiffre courant (n mod 10) avec la valeur renvoyée par l'appel récursif. Comme l'indique lbonn, si vous aviez beaucoup de nombres à convertir, vous les réécriviez pour éviter de les ajouter de façon répétée à une liste (ce qui prend du temps quadratique et génère beaucoup de données temporaires).

Questions connexes