如何识别C语言函数尾递归 判断search_array递归是否为尾递归
尾递归判定方法与问题解答
核心判定规则
判断一个递归调用是不是尾递归,只需要抓两个刚性标准,两个都满足才是尾递归:
- 递归调用是当前函数执行路径上的最后一个操作,调用返回后当前函数没有任何待执行的语句
- 递归调用的返回值直接作为当前函数的返回值,不需要经过赋值、运算、判断等任何中间处理
针对疑问代码的分析
你提到的ret = search_array (n , array , low , mid - 1)这行递归调用,两个条件都不满足:
- 这个递归调用返回后,当前函数还有明确的待执行任务:首先要把返回值赋值给局部变量
ret,接着要执行if (ret != -1)的条件判断,根据判断结果决定是直接返回ret,还是继续执行右半区间的查找逻辑。递归调用根本不是当前执行路径的最后一步。 - 这个递归的返回值没有被直接返回,而是先存入局部变量参与后续逻辑判断,仅当返回值不等于-1时才会被作为函数结果返回,不满足“返回值直接透传”的要求。
你之前判断最后一行return search_array (n , array , mid + 1 , high ) ;属于尾递归是完全正确的:执行到这行时,左半区间查找的逻辑已经全部跑完,没有任何待执行的前置/后置运算,递归调用的返回值会直接作为当前函数的返回值,完全符合尾递归的定义。
快速识别技巧
日常写代码不需要死抠概念,用一个直观的判断方法就能快速区分:
- 看到递归调用直接跟在
return后面,且return语句里除了递归调用本身没有其他运算、逻辑判断,大概率是尾递归 - 如果递归调用出现在赋值语句右侧、四则运算表达式里、条件判断语句中,或者return后除了递归调用还有其他计算逻辑(比如
return fact(n-1) * n这类写法),一定不是尾递归
内容的提问来源于stack exchange,提问作者Elrisas
相关产品推荐
相关产品推荐

