factorial[... end n] factorial_internal(... end 0 n) {all of this should be easier with anonymous functions} factorial_internal[... n] if(... n stop cont n) cont[... end res n] add(... end n factorial_internal_second res n) stop[... end res n] end(... res) factorial_internal_second[... end n res] subtract(... end res factorial_internal n 1)