/* Recursive Factorial */ long int rfact (long int x) { long int rval; if (x <= 1) return 1; rval = rfact(x-1); return rval * x; } /* Tail recursive computation */ long int t_helper (long int x, long int val) { if (x <= 1) return val; return t_helper(x-1, val*x); } /* Tail recursive version of factorial */ long int tfact(long int x) { return t_helper(x, 1); } /* Binary partitioning helper */ long int r_prod (long int from, long int to) { long int middle; long int prodA, prodB; if (from >= to) return from; middle = (from + to) >> 1; prodA = r_prod(from, middle); prodB = r_prod(middle+1, to); return prodA * prodB; } /* Binary splitting version of factorial */ int bfact (long int x) { return r_prod(1,x); } /* Tail recursive updating computation */ void s_helper (long int x, long int *accum) { if (x <= 1) return; else { *accum *= x; s_helper (x-1, accum); } } /* Storing version of factorial */ long int sfact (long int x) { long int val = 1; s_helper(x, &val); return val; } long int left_prod(long int *, long int *); long int right_prod(long int *, long int *); long int left_prod (long int *leftp, long int *rightp) { long int left = *leftp; if (left >= *rightp) return left; else { long int plus1 = left+1; return left * right_prod(&plus1, rightp); } } long int right_prod (long int *leftp, long int *rightp) { long int right = *rightp; if (*leftp == right) return right; else { long int minus1 = right-1; return right * left_prod(leftp, &minus1); } } /* Factorial with mutual recursion */ long int lrfact(long int x) { long int left = 1; return left_prod(&left, &x); } main () { lrfact(4); }