ML语言支持嵌套的函数声明。也就是说将函数作为参数,并把函数当作值返回。
直接上代码:
fun main()
{
let
fun fib0(n) =
let
fun fib1(n) =
let
fun fib2(n) = fib1(n-1) + fib2(n-2)
in
if(n >= 4) then fib2(n)
else fib0(n-1) + fib0(n-2)
end
in
if n >= 2 then fib1(n)
else 1
end
in
fib0(4)
end;
}
如果这段代码没看懂,希望下面这段话能够帮到你。
对于ML语言,函数是可以嵌套定义的,(这就和我们之前学过的c和java都不一样),所以可以咋一看不好理解。函数都是由函数名和函数体组成,ML语言的函数体由“ let——in——end ”共同组成。
下面这张图片可以帮你更好的理解上面的代码:
当你看懂上面这张图片,我们就可以分析这个main函数的执行过程。
当我们看一个函数时,首先要看函数体的三个部分的in部分(注意不是先看let部分) ,in中的代码一般是仅声明要调用哪个函数,然后再去let中去调用这个函数。
完整分析过程如下:
1.先进入main函数,然后看红色的in部分:fib0( 4 );
2.然后去main()的let块去找fib0函数(图中绿色部分),进入fib0函数,同样这个函数的in部分(绿色的in):满足if条件,执行fib1( 4 );
3.去fib0函数的let部分找fib1函数(蓝色部分),进入fib1函数,先看in部分(蓝色的in),满足if语句,执行fib2函数,然后去fib1函数的let部分。此时执行fib1(3) + fib1(2);先算fib1(3),,我们再去找fib1函数,然后是fib1的in部分,满足else语句。执行fib0(2)+fib0(1);
先求fib0(2),找到fib0函数,满足if语句,执行fib1(2);
找fib1函数,进入蓝色in部分,满足else,执行fib0(1)+fib0(0);先求fib0(1),找到fib0函数,进入绿色in部分,满足else,结束这个fib0(1)函数;
再求fib0(0),找到fib0函数,同样满足else,结束这个fib0(0)函数;再求上面剩下的fib0(1),找到fib0函数,满足else,结束这个fib0(1)函数;
注意,上面还剩下一个函数没有处理,fib1(2),进入fib1,满足else,接着执行fib0(1)+fib(0),因为上面的步骤已经执行过这句代码,不再赘述。
至此,本文结束。