提醒一下,我是 ocaml/函式式編程的新手。
我有一個函式,它是計算施羅德數的遞回關系之一。它在等式中兩次呼叫自己。
我想計算給定輸入時呼叫此函式的次數(我知道,例如,對于 n = 6,該函式呼叫自身 25 次),最好不使用可變性。
這是我現在擁有的代碼。它評估為 76 個函式呼叫。
let rec sn2 n k =
if n = 0 then 1, k
else if n = 1 then 2, k
else
let (a, b), (c, d) = sn2 (n - 1) (k 1), sn2 (n-2) (k 1) in
((((6 * n - 3) * a) - ((n - 2) * c)) / (n 1), b d k)
uj5u.com熱心網友回復:
你的函式不需要一個引數來告訴它的呼叫者被呼叫了多少次。呼叫者可以負責這個號碼(特別是因為你的代碼不是尾遞回的)。
相反,該函式可以只回傳 1(因為它顯然被呼叫了)加上它進行的任何遞回呼叫回傳的計數。
let rec sn2 n =
if n = 0 then 1, 1
else if n = 1 then 2, 1
else
let (a, b) = sn2 (n - 1) in
let (c, d) = sn2 (n - 2) in
((((6 * n - 3) * a) - ((n - 2) * c)) / (n 1), b d 1)
如果您只想計算“遞回”呼叫(而不是最外層呼叫),則可以從最終計數中減去 1。
這是我嘗試n
= 6 時看到的內容:
# sn2 6;;
- : int * int = (1806, 25)
這看起來非常接近您要查找的計數。
(我希望這不是家庭作業。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448943.html
上一篇:C:節點移除
下一篇:為什么我的遞回搜索功能不起作用?