当前位置: 首页 > 知识库问答 >
问题:

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

梁锋
2023-03-14

我一直在努力学习SML NJ(standard 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))=

但是,给定n=4,(4(和(4-1))=

如果有人能向我解释我的想法错误的原因或地方,那将是巨大的帮助,谢谢!

共有1个答案

王涵育
2023-03-14

程序显示sum(3)时,它并不意味着添加3,它意味着将所有数字添加到3,包括3,即0 1 2 3=6

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

|运算符对我说:求值第一个表达式sum 0=0。如果为false,求值第二个表达式。

当你想要第一个“0”整数的和时,它只返回0。它计算表达式的第二部分。

实例

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

第一个n数字的和是n sumOfFirst(n-1)UNLESSn=0,在这种情况下,它只是0,所以不要费心递归。这有意义吗?

希望有帮助!

 类似资料:
  • 问题内容: 我可以在变量中创建一个递归函数,如下所示: 这样,将输出 。假设我做了以下事情: 将输出 如上。如果我再更改如下: 然后将给出,如预期的那样。 现在给出 它所指的,而不是函数(它本身指向的)。在某些情况下这可能是理想的,但是有没有一种方法可以编写函数以便它调用自身而不是保存它的变量? 也就是说,是否可以 仅 更改线路,以便 在调用时仍能完成所有这些步骤?我试过了,但这给了我错误。 问题

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 我必须编写一个递归函数来检查两个相同大小的给定数组是否具有相同的元素,但它们可能顺序不同。 我认为最优雅的解决方案是对两个数组进行排序,然后比较每个元素,但我不知道如何在一个递归函数中对两个阵列进行排序。 所以我有另一个想法,使用线性搜索,获取数组1的最后一个元素并在数组2中搜索它,如果它在那里,使用移位函数,移动该元素前面的所有元素(在数组2中)并返回true,如果没有找到它,则返回false。

  • 这个递归编码是错误的还是仅仅是那个控制台。即使执行递归,log()也不总是被执行? 在控制台中执行testrecursion不会返回任何错误。 信息控制台日志显示 再次执行测试递归会在信息控制台日志中显示这一点。 第三次执行testrecursion会在信息控制台日志中显示这一点。 在对此进行了数十次测试后,递归步骤似乎偶尔被调用。输出似乎是随机的。预期输出为 这是否看起来像递归正确发生,只是控制

  • 本文向大家介绍详解Javascript函数声明与递归调用,包括了详解Javascript函数声明与递归调用的使用技巧和注意事项,需要的朋友参考一下 Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Ja