You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别C语言函数尾递归 判断search_array递归是否为尾递归

尾递归判定方法与问题解答

核心判定规则

判断一个递归调用是不是尾递归,只需要抓两个刚性标准,两个都满足才是尾递归:

  • 递归调用是当前函数执行路径上的最后一个操作,调用返回后当前函数没有任何待执行的语句
  • 递归调用的返回值直接作为当前函数的返回值,不需要经过赋值、运算、判断等任何中间处理

针对疑问代码的分析

你提到的ret = search_array (n , array , low , mid - 1)这行递归调用,两个条件都不满足:

  1. 这个递归调用返回后,当前函数还有明确的待执行任务:首先要把返回值赋值给局部变量ret,接着要执行if (ret != -1)的条件判断,根据判断结果决定是直接返回ret,还是继续执行右半区间的查找逻辑。递归调用根本不是当前执行路径的最后一步。
  2. 这个递归的返回值没有被直接返回,而是先存入局部变量参与后续逻辑判断,仅当返回值不等于-1时才会被作为函数结果返回,不满足“返回值直接透传”的要求。

你之前判断最后一行return search_array (n , array , mid + 1 , high ) ;属于尾递归是完全正确的:执行到这行时,左半区间查找的逻辑已经全部跑完,没有任何待执行的前置/后置运算,递归调用的返回值会直接作为当前函数的返回值,完全符合尾递归的定义。

快速识别技巧

日常写代码不需要死抠概念,用一个直观的判断方法就能快速区分:

  • 看到递归调用直接跟在return后面,且return语句里除了递归调用本身没有其他运算、逻辑判断,大概率是尾递归
  • 如果递归调用出现在赋值语句右侧、四则运算表达式里、条件判断语句中,或者return后除了递归调用还有其他计算逻辑(比如return fact(n-1) * n这类写法),一定不是尾递归

内容的提问来源于stack exchange,提问作者Elrisas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:09:14