Recursion SML递归函数的逻辑

Recursion SML递归函数的逻辑,recursion,smlnj,Recursion,Smlnj,嗨,我正在努力学习SML。例如,我在理解一些递归函数时遇到困难 fun Square (x:int, y:int)= if y=0 then 1 else x * Square(x,y-1); 我知道在else括号中,x乘以以x和y-1为参数的平方函数的值,这个过程将继续,直到y达到0。我只是不清楚在递归的每一步中x乘以什么?此外,一旦y达到0,为什么函数不返回1? 谢谢当y=0时,函数确实返回1,但此值将返回给调用者-Square(x,1),它将值返回给调用者,Square(x,2),

嗨,我正在努力学习SML。例如,我在理解一些递归函数时遇到困难

 fun Square (x:int, y:int)=
if y=0 
then 1 
else x * Square(x,y-1);
我知道在else括号中,x乘以以x和y-1为参数的平方函数的值,这个过程将继续,直到y达到0。我只是不清楚在递归的每一步中x乘以什么?此外,一旦y达到0,为什么函数不返回1? 谢谢

y=0时,函数确实返回1
,但此值将返回给调用者-
Square(x,1)
,它将值返回给调用者,
Square(x,2)
,依此类推。
(递归函数的最大秘密在于它们的工作方式与非递归函数完全相同。)

我认为最好的理解方法之一是使用替代法

正方形(3,2)
。将函数定义中的
x
y
替换为它们的值

if 2 = 0 then 1 else 3 * Square (3, 2-1)
2显然不是0,所以我们需要先弄清楚平方(3,1)是什么,然后才能继续乘法。
重复相同的过程:

if 1 = 0 then 1 else 3 * Square (3, 1-1)
条件仍然为false,因此继续执行
Square(3,0)

现在条件为真,所以我们知道
平方(3,0)
为1。
向后移动一级并替换:

if 1 = 0 then 1 else 3 * 1
所以,
平方(3,1)
是3。再次替换:

if 2 = 0 then 1 else 3 * 3
这等于9,这就是你所期望的

你也可以考虑这个(无穷的)非递归函数序列:

...
fun Square_3 (x, y) = if y = 0 then 1 else x * Square_2 (x, y-1)
fun Square_2 (x, y) = if y = 0 then 1 else x * Square_1 (x, y-1)
fun Square_1 (x, y) = if y = 0 then 1 else x * Square_0 (x, y-1)
fun Square_0 (x, y) = if y = 0 then 1 else x * Square_minus1(x, y-1)
fun Square_minus1 (x, y) = ...
然后想想
Square_2(3,2)
是如何工作的
Square(3,2)
的工作方式完全相同


(顺便说一句,您的函数有一个非常奇怪的名称。您可能想重命名它。)

谢谢molbdnilo这非常有用
...
fun Square_3 (x, y) = if y = 0 then 1 else x * Square_2 (x, y-1)
fun Square_2 (x, y) = if y = 0 then 1 else x * Square_1 (x, y-1)
fun Square_1 (x, y) = if y = 0 then 1 else x * Square_0 (x, y-1)
fun Square_0 (x, y) = if y = 0 then 1 else x * Square_minus1(x, y-1)
fun Square_minus1 (x, y) = ...