【发布时间】:2017-05-25 21:49:24
【问题描述】:
我有一个想要以尾递归形式编写的函数。该函数通过滚动s 双面骰子n 次来计算获得k 总和的方法数。我在this answer 上看到了这个函数的数学解。如下:
我在 R 中的参考递归实现是:
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))
}
}
我已经尝试按照从this answer 学到的继续传递风格重新编写函数,但我没有成功。有没有办法以尾递归的形式编写这个函数?
编辑
我知道 R 没有针对尾递归进行优化。我的问题不是 R 特定的,任何其他语言的解决方案同样受欢迎。即使它是一种没有针对尾递归进行优化的语言。
【问题讨论】:
-
看
?Recall。 -
@42- 我很高兴知道这一点,谢谢,但我看不出它有什么帮助,因为我没有更改函数名称的复杂性跨度>
-
递归在这种情况下不会是一个非常有效的实现,使用动态编程/记忆化来存储
f的值已经计算和重用。 -
@sandipan 当我需要这个函数时,我编写了我的参考实现并将它与 memoization 一起使用。它工作得很好。在这一点上,我不是在改进实现,我只是想知道尾递归是否适用于这种情况。
标签: recursion functional-programming dynamic-programming tail-recursion continuation-passing