【发布时间】:2013-11-21 12:53:30
【问题描述】:
我正在关注这个关于标准 ML 的教程:http://homepages.inf.ed.ac.uk/stg/NOTES/node2.html,我遇到了这个问题:
如果 n 为奇数,则正整数 n 的半阶乘为 1 × 3 × 5 × ... × n,如果 n 为偶数,则为 2 × 4 × 6 × ... × n。使用 reduce 函数定义计算半阶乘的 semifac 函数。
减少定义为:
fun reduce (g, e, m, n, f) =
if m > n then e else g (reduce (g, e, m, n-1, f), f n);
我花了几个小时来解决这个问题,但找不到不需要更改 reduce 函数的令人满意的答案。如果将 reduce 重新定义为:
fun reduce' (g, e, m, n, f) =
if m > n then e else g (reduce'(g, e, m, n-2, f), f n);
最终解决方案为:
fun semifactorial n = reduce'(fn (x,y) => x * y, 1, 1, n, fn x=>x);
我认为作者试图达到的目的是什么,但我不确定。有没有办法在不改变reduce定义的情况下解决这个问题?我在想有一些非常明显的功能方法可以做到这一点,但我看不出如何将减量减少 2 而不是 1(我的直觉说答案在于为 g 和 f 选择正确的函数 val)。
【问题讨论】:
标签: functional-programming sml smlnj