2012-02-23 3 views
2

Я видел этот пример о последовательности фибоначчи, затем тестировал его в IRB. Хотел, чтобы кто-то мог сломать его для меня и показать мне, как он использует тот же метод внутри метода, который определяется.Как этот метод использует свой собственный метод в рубине?

def fib(n) 
return n if (0..1).include? n 
fib(n-1) + fib(n-2) if n > 1 
end 
+2

Важно отметить, что в данном случае, не каждый вызов 'fib' приведет к другому вызову' fib', который является то, что удерживает его от становится бесконечным циклом. Слишком много звонков до некоторого возврата заканчивается нагромождением и созданием ошибки ** Stack Overflow **. ;) – coreyward

ответ

6

При определении метода с def whatever(...) вы делаете две вещи: создание метода, и назначение его в указанный слот метода.

Когда вы вызываете метод в Ruby, он будет выглядеть в локальной области; внутри метода fib, который включает в себя текущий объект, на котором определен fib. Итак, он находит текущее определение fib и вызывает его.

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

То есть он будет динамически находить код, связанный с именем , с именем при каждом вызове имени.

+0

Спасибо, Дэниэл помогает тонне! – ericraio

3

Это называется рекурсия ... Это образец, который время от времени появляется в программировании ... Если вы хотите запрограммировать, это инструмент/процесс, который вы должны изучить. Вместо того, чтобы извергать здесь то, что уже там, просто прочитайте, что находится на википедии ... В котором содержится объяснение последовательности фибоначчи, которая является примером рекурсии.

http://en.wikipedia.org/wiki/Recursion

+1

Честно говоря, я даже не знал, что этот фрагмент кода называется Recursion, что делает его довольно трудным для исследования того, что это значит. – ericraio