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

Understanding sum function calling itself (recursion?) - SML

我一直在尝试学习 SML NJ(新泽西州标准 ML),我遇到了一个我理解为递归的函数,但不太明白为什么函数 returns它的价值。

函数:

  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;我没有得到程序输出的值。

如果有人能向我解释为什么或哪里我想错了,那将是很大的帮助,谢谢!

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

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

| 接线员对我说,"Evaluate the first expression sum 0 = 0. IF it is false, evaluate the second"。

当你想要第一个“0”整数的总和时,它只是 returns 0。任何超过它的东西都会计算该表达式的第二部分。

例子

  1. 前 0 个整数之和为 0。
  2. 前1个整数之和为(前0个整数之和,即0)+(1本身)= 1
  3. 前 2 个整数之和为(前 1 个整数之和,即 1)+(2 本身)= 3
  4. 等等...

n 个数字的总和是 n + sumOfFirst(n-1) 除非 n=0 在这种情况下它只是 0,所以不要为递归而烦恼。这有意义吗?

希望对您有所帮助!