My Original Code:
# Factorial Using Recursion
res=1
fact()
{
x=$1
if [ $x -le 1 ]
then
echo "Actual - $res"
return `expr $res`
else
#echo $x
res=$(($res * $x))
echo "($res)"
fact $[$x-1]
fi
}
fact $1
echo "Factorial of $1 = $?"
The result (stored in $res) is certainly what I want and is also correct. But somehow when it is being returned and caught by $? it becomes erroneous.

returnis not meant to return arbitrary data; it returns an exit status. To return a value, write it to standard output or put it in a global variable. (No, "proper" programming practices are not always applicable inbash.)