SML 中的帕斯卡三角

Pascal's Triangle in SML

我正在尝试编写以下类型的函数:

pascal : int * int -> int

其中这对整数分别代表帕斯卡三角形的行和列。

这是我的尝试:

fun pascal(i : int, j : int) : int =
    if (i = 0 andalso j = 0) orelse i = j orelse i = 0
        then 1
    else
        pascal(i - 1, j - 1) + pascal(i - 1, j);

它适用于我的基本情况,但在其他情况下会给我奇怪的输出。例如:

pascal(4, 2) 给我 11 而 pascal(4, 1) 给我 15

这有点奇怪,因为只要 if 子句失败并且 else 得到评估,我确实想要 return 上一行元素与上一行元素与一个元素的总和靠左。

我做错了什么?

考虑pascal 1 0。如果您对 table 使用基于零的索引,那么它应该等于 1。但是:

pascal 1 0 = pascal 0 -1 + pascal 0 0 = 2

你应该采取一些措施来处理负指数和 j 大于 i 的指数。