2016-03-02 166 views
1

這是我的任務。尾遞歸和迭代SML

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 
; 

輸出是:

stdIn:102.11-103.6 Error: syntax error: deleting SEMICOLON END SEMICOLON 

我只被引入到SML在過去的2周,我不能讓我的頭周圍。很感謝任何形式的幫助。

+0

練習對我來說沒什麼意義 - 它對於非遞歸while循環版本來說意味着什麼,在任何意義上都等價於尾遞歸方法?在任何情況下 - 由於int變量不可變,'product:= product + b'在SML中是沒有意義的。類似的東西需要一個'int ref'。你研究過這些嗎? –

回答

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; 

(這不是你鏈接到遞歸碼的準確翻譯,因爲該代碼是不必要的複雜,您可能需要調整,這取決於你的教授。)

(我會寫遞歸版本更是這樣的:

fun mult (0, _) = 0 
    | mult (_, 0) = 0 
    | mult (a, b) = b + mult(a - 1, b); 

目前還不清楚爲什麼運動具有特例)