2015-08-15 108 views
0

我试着写类型的功能:帕斯卡三角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语句失败,否则获取评估,我确实想返回元素之一的总和在上面的行中,元素在上面一行,在左边一个元素。

我在做什么错?

+1

您不必写“谢谢”,或用您的名字签名,因为它会自动显示在您帖子的右下角。 – Jubobs

回答

2

考虑pascal 1 0。如果您使用从零开始的索引的表那么这应该是等于1,但:

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

你应该把一些卫士对付负指数和指数,其中ji更大。

+0

好的,很好,我只是通过基本上说“如果你得到我或j <0,然后给0回答”来修正负指数问题。我不明白这是如何导致我在我的帖子中列出的电话获得11和15。另外,假设用户没有输入j> i,我不认为我的代码可以达到这一点。这将需要i = j并且返回1,并且不再进行递归调用。 – bclayman

+1

@bclayman你说得对,如果用户没有输入,就不可能达到j> i。我在考虑二项式系数的解释。用负指数解决问题是否得到正确的结果? – mrmcgreg

+0

啊啊。它的确如此,但我不确定为什么它会为我在OP中提到的电话提供11或15个电话。我明白高层不应该用负指数打电话,但过去我有点失去了价值超过其正确价值(例如11而不是6)的情况。 – bclayman