2015-10-06 1 views
0

Я пытался узнать SML NJ (стандартный ML Нью-Джерси), и я столкнулся с функцией, которую, как я понимаю, является рекурсией, но не могу точно понять почему функция возвращает значение, которое оно делает.Понимание функции sum, вызывающей себя (рекурсия?) - SML

Функция:

fun sum 0 = 0 | sum n = n+sum (n-1); 

Я понимаю, что если значение суммы равно 0, то 0 будет возвращено. Однако я не понимаю, как работает вторая часть.

Тестирование функции:

Input: sum 0; ---> output: 0; 
Input: sum 1; ---> output: 1; 
Input: sum 2; ---> output: 3; 
Input: sum 3; ---> output: 6; 
Input: sum 4; ---> output: 10; 

Я считаю, что он должен рассчитать такие как: сумма N = (N + (сумма (п-1)), так что с учетом п = 2, (2 + (сумма (2-1)) => 2 + 1 = 3;

Но, учитывая n = 4, (4 + (сумма (4-1)) => 4 + 3 = 7, я не получаю значение что outputed программой.

Если кто-нибудь может объяснить мне, почему или где я думаю, неправильно, это было бы большим подспорьем, спасибо!

ответ

1

Когда программа говорит сумма (3) это не означает, что add 3, это означает, добавить все числа вплоть до 3 т 0 + 1 + 2 + 3 = 6

Я понятия не имею, что SML NJ есть, но вот мое объяснение -

Оператор | говорит мне: «Оцените первое выражение sum 0 = 0. Если оно ложно, оценить второй».

Если вы хотите, чтобы сумма первых„0“целых чисел, он просто возвращает 0. Любой вещи более, что он оценивает вторую часть этого выражения.

Пример

  1. сумма первых чисел 0 равно 0.
  2. сумма первого 1 целого числа (сумма первых чисел 0, то есть 0) + (1 сам по себе) = 1
  3. сумма первых 2 целых чисел (сумма первых 1 целых чисел, то есть 1) + (2 сам) = 3
  4. И так далее ...

Сумма первых n чисел n + sumOfFirst(n-1) ПОКА n=0 в этом случае это просто 0, так что не беспокойтесь рекурсии. Имеет ли это смысл?

Надеюсь, что это поможет!

+0

Да, правильно, я понимаю эту часть, но второе выражение, которое я немного смущен в aha –

+0

См. Мой отредактированный ответ. – Prashant

+1

Ну ладно, я думаю, я это понимаю! Огромное спасибо! –