epicours/Algo/Séminaire/Chapter 5 - Recursivity.md

45 lines
1.2 KiB
Markdown

![Alt](https://gitea.louisgallet.fr/lgallet/epicours/raw/branch/main/Algo/S%C3%A9minaire/assets/recursivite-meme.png "recursivity problem")
### 5.1. Simple functions
To create a recursive function we have to use this structure
```Ocaml
(*normal function*)
# let f = expr -> 1) evaluate expr ; 2) create & link f to the result
(*recursiv function*)
# let rec f = expr -> 1) create f ; 2) evaluate expr ; 3) link f to the result
```
**Exmple with factorial function**
```Ocaml
# let rec fact = function
| 0 -> 1
| n -> n * fact(n-1)
# fact 4;;
-: int = 24
```
![Alt](https://gitea.louisgallet.fr/lgallet/epicours/raw/branch/main/Algo/S%C3%A9minaire/assets/fact%20function%20response.png)
> ⚠️ CAML have a call stack limite (it will block with stack overflow if the limit is reach)
**Basic expression**
```Ocaml
let rec f params =
if stop condition then
stop expression
else
recursive expression
```
To write a recurvise function we need two things
1) There always is a stop case
2) The parameters of a recursive call are different then its parent call, and go towards the stop condition
### 5.2. Down
```Ocaml
# let rec countdown n =
if n = 0 then
print_int(0)
else
print_int(countdown (n-1));;