Looks cool.
But
fact = x_ /; x > 1 :> x ((x - 1) /. fact);
and
In[132]:= 0 /. fact Out[132]= 0
when ( mathmatically correct ! )
In[134]:= 0! Out[134]= 1
Sounds good. But what is the role of Factorial2? Shouldn't it be
fact = x_ :> If[x == 1 || x == 0, 1, x ((x - 1) /. fact)];
small test
Range[10] /. fact {1, 2, 3, 8, 15, 48, 105, 384, 945, 3840}
the rule of Factorial2
fact = x_Integer :> If[x == 1 || x == 0, 1, x ((x - 2) /. fact)];
Thanks, Hans Dolhaine for Hint.
The correct Rule:
fact = x_ :> If[x == 1!! x == 0, 1, x ((x - 1) /. fact)];