1. First
    1. When recurring on a list of atoms, lat, ask two questions about it: (null? lat) and else
    2. when recurring on a number, n, always two questions: (zero? n) and else
    3. When recurring on a list of S-expressions, l, ask three questions about it: (null? l), (atom? (car l)), and else
  2. Second: use cons to build lists
  3. Third: when building a list, describe the first typical element, and then cons it onto the natural recursion
  4. Fourth
    1. always change at least 1 argument when recurring. It must be changed to be closer to termination.
      1. When recurring on a number n, use (sub1 n)
      2. When recurring on a list of atoms, lat, use (cdr lat)
      3. When recurring on a list of S-expressions, l, use (car l) and (cdr l) if neither (null? l) nor (atom? (car l)) are true
    2. The changing argument must be tested in the termination condition
      1. when using cdr, test termination with null?.
      2. When using sub1, test termination with zero?.
  5. Fifth
    1. When building a value with +, always use 0 for the value of the termination line, since 0 does not change the value of an addition
    2. When building a value with *, always use 1 for the value of the termination line, since 1 does not change the value of a multiplication
    3. When building a value with cons, always consider () for the value of the termination line
  6. Six: simplify only after the function is correct
  7. Seventh: recur on the subparts that are of the same nature
    1. On the sublists of a list
    2. On a subexpressions of an arithmetic expression
  8. Eighth: use help functions to abstract from representations
  9. Ninth: abstract common patterns with an new function.
  10. Tenth: build functions to collect more than one value at a time