2011-09-25 24 views
3

我對SML真的很陌生,我無法弄清楚如何得到同樣的答案;SML/NJ while循環

它類似於:3^4 < 32但3^5> 32所以我的回答是4(3的冪),同樣如果我有數字4和63,那麼4^2 < 63但是4^3> 63所以我的回答是2(4的冪)。

我想出了下面的代碼

val log (b, n) = 
    let 
     val counter = ref b 
     val value = 0 
    in 
     while !counter > n do 
     (counter := !counter*b 
      value := !value + 1) 
    end; 

因此,這裏的值是什麼,我需要爲我的答案,但我得到了很多的錯誤。我知道我在很多地方都是錯的。任何幫助,將不勝感激。

我也許可以做這正常ML方式,但我想學不純ML還...

fun loghelper(x,n,b) = if x>n then 0 else (1+loghelper((x*b),n,b)); 
fun log(b,n) = loghelper(b,n,b); 

確定,所以終於在這裏是while循環正確的代碼和它的作品爲好;

 fun log (b, n) = 
      let 
       val counter = ref b 
       val value = ref 0 
      in 
       while (!counter <= n) do 
       (counter := !counter*b; 
       value := !value + 1); 
       !value 
      end; 

回答

3

你在你的代碼的幾個問題:

錯誤:

  • 而不是val log (b, n) =應該fun log (b, n) =fun是一種方便的語法,可讓您輕鬆定義函數。如果你想與val寫這個你可以這樣寫:(counter := !counter*b; value := !value + 1)
  • value需求:val log = fn (b, n) =>
  • 你需要一個分號來分隔兩個命令語句(它的遞歸函數或函數與多個咖喱參數的情況變得更爲複雜)是一個refval value = ref 0

邏輯:

  • 你的函數不返回任何東西。 A while循環有單位類型,所以你的函數返回()(單位)。您可能想要返回!value。要做到這一點,你需要在整個while循環之後添加一個分號,然後編寫!value
  • 你的while循環條件並不真正有意義。它似乎相反。你可能想要while !counter <= n do
  • 你的基本情況是不正確的。 value應該從1開始(因爲counter開始於b,並且bb爲第一次方);或counter應該從1開始(因爲b到0的次冪是1)。您的功能版本存在同樣的問題。
+0

功能版本工作正常,但不純的版本需要你推薦的。非常感謝..我應該也發佈更正的代碼。 –

+0

準確地說,'fun'是'val rec'的語法糖。我相信你已經知道@newacct,並且爲了簡單的答案(相當於...)簡化了它。但我認爲這仍然值得一提。 –

+0

@ Jesper.Reenberg:是的,我知道(我編輯了答案)。並且'fun'允許你寫多個(curried)參數,而使用'val'你必須做'fn a => fn b =>' – newacct