以下でこの循環依存を解消しようとしていますが、最善の方法がわかりません。
let cashOpeningBalance t =
if t = 1 then
0.0
else
cashClosingBalance (t - 1)
let cashInterest t =
cashOpeningBalance t * 0.03
let accumulatedCash t =
cashOpeningBalance t + cashInterest t
// let moreComplicatedLogic t = ...
let cashClosingBalance t =
accumulatedCash t
この回答からいくつかのロジックを使用して、次の解決策を思いつきましたが、パフォーマンスが非常に悪いです。
let cashOpeningBalance t cashClosingBalance =
if t = 1 then
10.0
else
cashClosingBalance (t - 1)
let cashInterest t cashClosingBalance =
(cashOpeningBalance t cashClosingBalance) * 0.03
let accumulatedCash t cashClosingBalance =
(cashOpeningBalance t cashClosingBalance) + (cashInterest t cashClosingBalance)
// let moreComplicatedLogic t cashClosingBalance = ...
let rec cashClosingBalance t =
//accumulatedCash t cashClosingBalance
let temp = accumulatedCash t cashClosingBalance
printfn "Cash Closing Balance = %f Where t = %i" temp t
temp
cashClosingBalance 3
(*
>
Cash Closing Balance = 10.300000 Where t = 1
Cash Closing Balance = 10.300000 Where t = 1
Cash Closing Balance = 10.609000 Where t = 2
Cash Closing Balance = 10.300000 Where t = 1
Cash Closing Balance = 10.300000 Where t = 1
Cash Closing Balance = 10.609000 Where t = 2
Cash Closing Balance = 10.927270 Where t = 3
val it : float = 10.92727
*)
cashClosingBalance 50
(*
Takes a really long time
*)
以下の出力に見られるように、cashClosingBalance 関数を書き直して過度の再帰呼び出しを停止する方法はありますか? 最大 400 の t の値を入力できるようにする必要があり、それでも数秒で実行されます。