avoid self recursion