Soit n = c0c1 . . . ck :
1. Trois cas se présentent :
— si n < 0, alors la solution (par défaut) est 0.
— si k = 0, c.-à-d. 0 ≤ n < 10, alors la solution est n.
— si k > 0, c.-à-d. n ≥ 10, alors c0 +c1 +· · ·+c(k−1) est un sous-problème de même nature. Il s’agit de calculer la somme des chiffres de |n/10|.
2. Si l’on suppose que sommeChiffres(|n/10|) est résolu, alors il suffit de faire (n mod 10) + sommeChiffres(|n/10|) pour calculer sommeChiffres(n).
Nous avons donc :
sommeChiffres :: Integer -> Integer
sommeChiffres n
| n < 0 = 0
| n < 10 = n
| otherwise = ( n ‘mod ‘ 10) + sommeChiffres ( n ‘div ‘ 10)