You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

递归求和函数传参疑问:num/10与num=num/10传参为何结果不同?

为什么两种递归调用写法结果不同?

嘿,咱们先拆解下你遇到的问题,核心其实是递归调用中变量修改和参数传递的本质差异,结合你的代码来一步步看:

首先得提一句:你原代码里的for循环其实是多余的——递归本身就会逐步拆解数字,循环反而会导致重复计算,这也是你最初结果错误的诱因之一。不过咱们重点聊你关心的两种调用方式:

1. 直接调用 summation(num / 10) 的问题

当你写summation(num / 10)时:

  • num / 10是一个临时计算的表达式结果,它只会作为实参传递给递归调用的函数,但当前函数里的num变量本身完全没被修改
  • 更关键的是,你完全没利用这个递归调用的返回值——相当于白发起了递归,结果没加到sum里。
  • 再加上for循环会执行5次,每次循环里num都是初始值,导致每次取的余数都是同一个数字(比如输入123的话,每次rem都是3),最终sum会是这个余数重复加5次,结果自然错误。

2. 先执行 num = num / 10 再调用 summation(num) 的情况

当你先做num = num / 10时:

  • 这一步直接修改了当前函数中的num变量,把它变成了除以10后的新值。
  • 后续循环里,num已经是更新后的值了,每次取余数都会拿到下一位数字(比如输入123,第一次rem=3,num变成12;第二次rem=2,num变成1,以此类推)。
  • 不过这里有个隐藏问题:你其实没用到递归的返回值,本质上是靠循环完成了各位和的计算,递归调用只是个多余的操作。但因为循环能正确遍历每一位,所以结果是对的。

二者是否等价?

完全不等价:

  • 第一种写法中,num变量的值自始至终不变,传递给递归的是临时计算值,且递归结果未被利用,逻辑完全错误。
  • 第二种写法中,num变量被主动修改,后续循环能正确遍历各位,虽然递归没发挥作用,但结果正确。

补充:正确的递归实现方式

其实你不需要循环,递归的正确写法应该是这样的,逻辑清晰且不需要修改原变量:

int summation(long int num) {
    if (num < 10)
        return num;
    else
        // 取当前最后一位,加上剩余数字的各位和
        return (num % 10) + summation(num / 10);
}

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

火山引擎 最新活动