我一直在努力学习SML NJ(标准ML新泽西)并且我遇到了一个我理解为递归的函数,但是无法弄清楚为什么函数返回它所做的值。
功能:
fun sum 0 = 0 | sum n = n+sum (n-1);
据我所知,如果sum的值为0,则返回0。但是,我不明白第二部分是如何工作的。
测试功能:
Input: sum 0; ---> output: 0;
Input: sum 1; ---> output: 1;
Input: sum 2; ---> output: 3;
Input: sum 3; ---> output: 6;
Input: sum 4; ---> output: 10;
我认为应该计算如下:sum n =(n +(sum(n-1)),所以给定n = 2,(2 +(sum(2-1))=> 2 + 1 = 3;
但是,给定n = 4,(4 +(sum(4-1))=> 4 + 3 = 7;我没有得到程序输出的值。
如果有人能向我解释我为什么或在哪里思考错误,那将是非常有帮助的,谢谢!
答案 0 :(得分:1)
当程序说sum(3)时它并不意味着add 3
,它意味着添加所有数字,包括3,即0 + 1 + 2 + 3 = 6 < / p>
我不知道SML NJ是什么,但这是我的解释 -
|
运算符对我说,&#34;评估第一个表达式sum 0 = 0
。如果它是假的,评估第二个&#34;。
当你想要第一个&#34; 0&#34;的总和时整数,它只返回0.任何事情,它评估该表达式的第二部分。
实施例
前n
个数字的总和是n + sumOfFirst(n-1)
除n=0
,在这种情况下它只是0
,所以不要为递归而烦恼。这有意义吗?
希望有所帮助!