use non recursion