递归实现