// Think CS ch. 4 & 5 examples
#include <iostream>
#include <cmath>
#include <assert.h>
using namespace std;

void countdown (int n) { // n>0 please!
    if (n == 0) {
        cout << "Blastoff!" << endl;
    } else {
        cout << n << endl;
        countdown (n-1);
        cout << "backing out " << n << endl;
    }
}


int fac (int n) {
    int result;
    assert (n >= 0);
    cout << "Computing fac(" << n << ")...\n";
    if (n == 0) {
        result = 1;
    } else {
    	int recurse = fac(n - 1);
    	cout << "... n * recurse = " << n << " * " << recurse;
    	cout << " = " << n*recurse << endl;
        result = n * recurse;
    }
    cout << "fac(" << n << ") = " << result << endl;
    return result;

}

/*
int fac (int n) {
    if (n==0) {
        return 1;
    } else {
        return n * fac(n-1);
    }
}
*/

double distance (double x1, double y1, double x2, double y2) {
    double dx = x1 - x2;
    double dy = y1 - y2;
    return sqrt (dx*dx + dy*dy);
}

int main () {
	cout << "4! = " << fac(4) << endl;
    return 0;
}

