projprog/HSK18.md
2022-01-07 20:18:26 +01:00

38 lines
1.4 KiB
Markdown

# Haskell 18
### Exercice 1
1. Une fonction récursive est une fonction qui s'auto-référence et qui s'appelle elle-même. C'est utilisé pour décrire des suites mathématiques récursives, ou pour traiter plus généralement des problèmes qui ont une solution inductive simple.
2.
```
allMin :: Ord a => [a] -> a
allMin [e] = e
allMin (e:s) = min e (allMin s)
```
3. Par exemple lors de l'appel `allMin [1,4,3,7,9,5,8,0,1,3,45,5]`, Haskell va chercher dans ses pattern un qui corresponde, il trouve `allMin e:s`, puis remplace par `min 1 (allMin [4,3,7,9,5,8,0,1,3,45,5])`. Il continue jusqu'à tomber sur un cas qu'il connait, ici `allMin [5]`.
### Exercice 2
1.
a. La factorielle est naturellement définie récursivement pas (n+1)! = (n+1)*n! et 0!=1
b. Cette fonction semble peu naturelle en récursif, bien que ce soit possible (c'est toujours possible), on aurait une fonction au moins aussi compliqué qu'un algo pour la multplication quelconque.
c. Naturellement définie car `replicate (n+1) x = x:(replicate n x)` et `replicate 0 x = []`
d. Naturellement définie car `sum e::s = e+(sum s)` et `sum [] = 0`
2.
```
fact :: Num a => Eq a => a -> a
fact 0 = 1
fact n = n*(fact (n-1))
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = [ ]
| otherwise = x : replicate' (n - 1) x
ssum :: Num a => [a] -> a
ssum [] = 0
ssum (e:s) = e+(ssum s)
```
### Exercice 3
Voir fstfunc.hs