尾递归和迭代SML

use*_*728 1 iteration translation tail-recursion sml translate

这是我的任务.

(http://prnt.sc/aa3gwd)

我一直在和导师一起工作,这是我们迄今为止所提出的.

fun mult(a,b) =
  let
    val product = 0
in
    if (a = 0) then 
0
   else
     while a > 0 do
     (                  
       product := product + b;  
       if (a = 1) then 
  product
else
          a:= a -1
     );       
end;
; //the function did not run at end;, so we added these two semicolons below
;
Run Code Online (Sandbox Code Playgroud)

输出是:

stdIn:102.11-103.6 Error: syntax error: deleting  SEMICOLON END SEMICOLON
Run Code Online (Sandbox Code Playgroud)

在过去的两周里我才被介绍给SML而且我无法理解它.很感谢任何形式的帮助.

mol*_*ilo 5

你需要两个(可变的)引用变量; 一个用于产品,一个用于柜台.

像这样的东西:

fun mult(a, b) =
  let val product = ref 0
      val counter = ref a
  in
      while !counter > 0 do (
          product := !product + b;
          counter := !counter - 1
      );
      !product
  end;
Run Code Online (Sandbox Code Playgroud)

(这不完全是您链接的递归代码的翻译,因为该代码不必要地复杂.您可能需要调整,具体取决于您的教授.)

(我会写更像这样的递归版本:

fun mult (0, _) = 0
  | mult (_, 0) = 0
  | mult (a, b) = b + mult(a - 1, b);
Run Code Online (Sandbox Code Playgroud)

目前还不清楚为什么演习有特殊情况a = 1.)