add tailrec annotation