【问题标题】:Understanding sum function calling itself (recursion?) - SML了解 sum 函数调用自身(递归?) - SML
【发布时间】:2016-01-03 19:37:57
【问题描述】:

我一直在尝试学习 SML NJ(标准 ML New Jersey),并且遇到了一个我理解为递归的函数,但不能完全弄清楚为什么该函数会返回它所做的值。

功能:

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

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

【问题讨论】:

    标签: function recursion sml smlnj


    【解决方案1】:

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

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

    | 运算符对我说:“计算第一个表达式 sum 0 = 0。如果它为假,则计算第二个”。

    当您想要第一个“0”整数的总和时,它只返回 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,所以不要为递归而烦恼。这有意义吗?

    希望有帮助!

    【讨论】:

    • 是的,我理解那部分,但第二个表达我有点困惑啊哈
    • 啊好吧,我想我明白了!非常感谢!
    • 那么函数将n之前的每个数字加在一起?当然,直到 0。
    • 正确。 sum(n)之前和包括 n
    • 好的,太好了!谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2015-06-19
    • 2019-06-20
    • 2022-01-18
    • 2014-12-30
    • 2021-07-20
    相关资源
    最近更新 更多