递归求和函数传参疑问: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




