use recur so we dont blow the stack