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

递归函数中先赋值移动节点再调用与直接传next节点调用的区别

两种递归调用写法的差异分析

两种写法的核心逻辑完全等价,运行结果没有任何区别,仅存在以下实现层面的差异:

  • 局部变量操作不同
    第一种写法会先修改当前函数栈帧中listA、listB两个局部指针变量的取值,再将修改后的变量作为参数传入下一层递归;第二种写法不会修改当前栈帧的任何局部变量,直接提取两个指针的link成员作为参数传入递归调用。
  • 编译后指令存在微小差异(无优化场景)
    未开启编译优化时,第一种写法会多出两次局部变量赋值的CPU指令,开启O2及以上等级优化后,编译器会将两种写法优化为完全一致的机器码,运行效率没有任何差别。
  • 代码可读性不同
    第二种写法更简洁直观,阅读代码时可以直接识别递归调用的入参内容,不需要额外追踪局部变量的修改逻辑。

额外提示:你的原Check函数存在空指针访问漏洞

原代码仅判断了两个链表同时为空的终止条件,缺少单链表为空的判断,若输入的两个链表长度不一致,会触发空指针访问崩溃。可以补充如下判断修复问题:

bool Check(Node *listA, Node *listB) {
   // 两个都为空,相等
   if (listA == NULL && listB == NULL)
      return true;
   // 只有一个为空,不相等
   if (listA == NULL || listB == NULL)
      return false;

   if (listA->item == listB->item)
   {
      return Check(listA->link, listB->link);
   }
   return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:36:07