2016-11-06 83 views
2

我是F#的新手,當我試圖實現函數rpt時,發現了一些麻煩。F#函數返回值

let rec rpt f n x = 
    if n=0 then x 
    else 
     f (rpt f (n-1) x) 

當我稱這個功能爲rpt (fun x -> x*x) 4 2。答案是確定的val it : int = 65536但是當我改變rpt如下(只乘以2):

let rec rpt f n x = 
    if n=0 then 2*x 
    else 
     f (rpt f (n-1) x) 

功能只有零回報:val it : int = 0。誰能解釋發生了什麼?

+2

是'int'返回值溢出?它是否適用於其他輸入? – Lee

+0

@李是的,你是完全正確的,謝謝。我對於理解功能範式非常困惑,所以我沒有看到這個明顯的原因。 – YV17

回答

4

重複四次平方函數給出2^4 = 16的總冪,這與您的第一個答案完全一致 - 65536 = 2^16。但是,如果您在開始時添加額外的第二個功率,則總功率爲16 * 2 = 32,這恰好是int類型的大小,因此它完美地溢出並給出零。

您可以通過int64更換int驗證這一點:

let rec rpt f n x = 
    if n=0 then 2L*x 
    else 
     f (rpt f (n-1) x) 

> rpt (fun x -> x*x) 4 2L;; 
val it : int64 = 4294967296L 

> pown 2L 32;; 
val it : int64 = 4294967296L