理解sum函数调用自身(递归?) - SML

时间:2015-10-06 18:56:20

标签: function recursion sml smlnj

我一直在努力学习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;我没有得到程序输出的值。

如果有人能向我解释我为什么或在哪里思考错误,那将是非常有帮助的,谢谢!

1 个答案:

答案 0 :(得分:1)

当程序说sum(3)时它并不意味着add 3,它意味着添加所有数字,包括3,即0 + 1 + 2 + 3 = 6 < / p>

我不知道SML NJ是什么,但这是我的解释 -

|运算符对我说,&#34;评估第一个表达式sum 0 = 0。如果它是假的,评估第二个&#34;。

当你想要第一个&#34; 0&#34;的总和时整数,它只返回0.任何事情,它评估该表达式的第二部分。

实施例

  1. 前0个整数的和为0。
  2. 前1个整数之和为(前0个整数之和,即0)+(1本身)= 1
  3. 前2个整数的和是(前1个整数之和,即1)+(2本身)= 3
  4. 依旧......
  5. n个数字的总和是n + sumOfFirst(n-1)n=0,在这种情况下它只是0,所以不要为递归而烦恼。这有意义吗?

    希望有所帮助!