Kotlin的sum变量为何多计算1导致summation(8)结果为37?
问题根因
你代码中的sum是单例对象GrassHopper的全局成员属性,而不是summation函数的内部局部变量,Kotlin 中object声明的单例对象的属性会在整个程序运行周期内持久保存值,不会在每次函数调用时自动重置。
- 第一次调用
GrassHopper.summation(1)时,sum初始值为0,累加1后变为1,返回结果1符合预期,但调用结束后sum的值已经被修改为1,没有重置回初始值。 - 第二次调用
GrassHopper.summation(8)时,sum从1开始累加1到8的和(1+2+...+8=36),最终计算结果为1+36=37,和预期的36不符。
修复方案
只需要把sum变量移到summation函数内部定义即可,每次调用函数都会初始化新的sum变量,不会复用之前的计算结果:
object GrassHopper { fun summation(n:Int):Int { var sum = 0 for (i in 1..n){ sum += i } return sum } }
如果确实需要把sum作为单例的成员属性,也可以在每次函数调用开始时先将sum重置为0:
object GrassHopper { var sum = 0 fun summation(n:Int):Int { sum = 0 // 每次调用先重置初始值 for (i in 1..n){ sum += i } return sum } }
内容的提问来源于stack exchange,提问作者Abhas Sharma
相关产品推荐
相关产品推荐

