If one of the input parameters is necessarily a natural number (by which I mean that the function wouldn't make sense on a negative number or a non-integer), use the "several possible cases" template, combined with the fact that non-zero natural numbers "have" a predecessor which is itself a natural number.
Data definition:(An equivalent way to write
a natural number is either
0
, or(add1 natural-number)
(add1 natural-number)
is
(+ 1 natural-number)
).
So the body will be a cond
with two cases:
(define (template-for-nat-num n) (cond [(= n 0) ...] [(> n 0) ...]))Furthermore, if the natural number is positive, you know that it has a predecessor, so by the "compound data type" rule you can expand the template to
(define (template-for-nat-num n) (cond [(= n 0) ...] [(> n 0) ... n ... ... (sub1 n) ... ; or equivalently (- n 1) ]))In the
(> n 0)
cond-clause, we know that n
is
positive, so (sub1 n)
is a natural number too, which is the
same type we started with. So the most likely
thing to do with "(sub1 n)
" is to apply the same
function to it:
(define (template-for-nat-num n) (cond [(= n 0) ...] [(> n 0) ... n ... ... (sub1 n) ... ; or equivalently (- n 1) ... (template-for-nat-num (sub1 n)) ]))