2015-08-15 3 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

Это немного странно, потому что, до тех пор, как если пункт терпит неудачу и еще получает оценку, я хочу, чтобы вернуть сумму элемента одной строка выше и один элемент вверху и один элемент слева.

Что я делаю неправильно?

+1

Вам не нужно писать «Спасибо» или подписать с вашим именем, так как оно автоматически появляется в правом нижнем углу вашего сообщения. – Jubobs

ответ

2

Рассмотрите pascal 1 0. Если вы используете индексацию с нуля для таблицы, то это должно быть равно 1. Но:

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

Вы должны поставить некоторые охранники, чтобы иметь дело с отрицательными индексами и индексами, где j больше i.

+0

ОК, отлично, я просто исправил проблему с отрицательными индексами, в основном говоря: «Если вы получаете i или j <0, а затем возвращаете 0». Я не понимаю, как это заставило меня получить 11 и 15 для звонков, перечисленных в моем сообщении. Кроме того, если предположить, что пользователь не вводит j> i, я не думаю, что мой код может достичь этого. Это потребует i = j, и это возвращает 1 и не делает дальнейших рекурсивных вызовов. – bclayman

+1

@bclayman Вы правы, что невозможно достичь j> i, если пользователь не вводит их. Я думал об интерпретации в терминах биномиальных коэффициентов. Устранила ли проблема проблему с отрицательными индексами правильный результат? – mrmcgreg

+0

Ahh gotcha. Это произошло, но я не уверен, почему это даст мне 11 или 15 для звонков, которые я упоминаю в OP. Я понимаю, что на высоком уровне он не должен делать вызовы с отрицательными индексами, но в прошлом я немного потерял о том, как значение превышает допустимое значение (например, 11 вместо 6). – bclayman

Смежные вопросы