Il est un modèle commun pour séparer une fonction dans une partie "fixe" et une partie inductive. Dans ce cas, une fonction d'assistance imbriquée est nécessaire pour effectuer le travail récursif réel dans une nouvelle portée alors que nous voulons corriger une chaîne d'entrée s
en tant que constante afin que nous puissions l'utiliser pour ajouter à s2
. s2
est un accumulateur qui construit le train de chaînes au fil du temps tandis que c
est un inducteur comptant jusqu'à 1 vers le cas de base.
let repeat s n =
let rec helper s1 n1 =
if n1 = 0 then s1 else helper (s1^s) (n1 - 1)
in helper "" n
Une version d'appel non-queue est plus simple puisque vous aurez pas besoin d'une fonction d'aide du tout:
let rec repeat s n =
if n = 0 then "" else s^repeat s (n - 1)
Sur la note de côté, une chose très amusant d'une langue fonctionnelle avec le premier Les fonctions de classe comme Ocaml sont en cours d'exécution (ou application partielle). Dans ce cas, vous pouvez créer une fonction nommée repeat
qui prend deux arguments n
de type int
et s
de type string
comme ci-dessus et appliquer partiellement soit n
ou s
comme ceci:
# (* top-level *)
# let repeat_foo = repeat "foo";;
# repeat_foo 5;;
- : bytes = "foofoofoofoofoo" (* top-level output *)
si l'argument n
a été marqué comme ci-dessous:
let rec repeat ?(n = 0) s =
if n = 0 then "" else s^repeat s (n - 1)
l'ordre d'application peut être exploitée, ce qui rend la fonction plus souple:
# (* top-level *)
# let repeat_10 = repeat ~n:10;;
# repeat_10 "foo";;
- : bytes = "foofoofoofoofoofoofoofoofoofoo" (* top-level output *)
Voir mon article Currying Exercise in JavaScript (bien que ce soit en JavaScript, mais assez simple à suivre) et ce lambda calculus primer.
Vous devriez d'abord penser à la condition d'arrêt de votre fonction récursive.Ensuite, vous devez connaître la syntaxe à appliquer dans ocaml pour déclarer une fonction récursive (c'est le niveau de cours ocaml). –
Pouvez-vous s'il vous plaît mettre dans l'erreur que vous recevez? – AlexKoren
Bit hors sujet, mais 'String.make 20 'u'' fait le travail. – camlspotter