私はテールの再帰的な形で書く機能を持っています。この関数は、の合計を得る方法の数を、s
の両面ダイn
回を丸めて計算します。私はthis answerでこの関数の数学的解を見てきました。私はthis answerから学んだように私は継続渡しスタイルで再書き込み機能に試してみました畳み込み関数を末尾の再帰形式で記述することはできますか?
sum_ways <- function(n_times, k_sum, s_side) {
if (k_sum < n_times || k_sum > n_times * s_side) {
return(0)
} else if (n_times == 1) {
return(1)
} else {
sigma_values <- sapply(
1:s_side,
function(j) sum_ways(n_times - 1, k_sum - j, s_side)
)
return(sum(sigma_values))
}
}
、しかし:Rで
マイ参照再帰的な実装は次のようになります。それは以下の通りです。私は成功しなかった。 tail-recursive形式でこの関数を書く方法はありますか?
EDIT
私はRは末尾再帰のために最適化しないことを知っています。私の質問はR固有ではなく、他の言語のソリューションも同様に歓迎されます。たとえそれが末尾再帰を最適化しない言語であったとしても。
ルック:
は、ここではPythonで継続渡しスタイルへの変換(ないが適切な末尾再帰を持っている別の言語)です。 –
@ 42-私はこれについて学んでうれしいですが、ありがとうございます。しかし、私は関数の名前を変更するという複雑さがないので、どのように役立つのかわかりませんでした – refik
再帰は非常に効率的な実装ではありませんこの場合、動的プログラミング/メモを使用して、既に計算され、再使用された 'f 'の値を保存します。 –