?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
Это мой хвост
nyaload
_winnie
Хочется в языках где принято полагаться на хвостовую рекурсию - уметь явно помечать вызов как хвостовой. Что бы компилятор мог поймать за руку, если я считаю что вызов хвостовой, а на самом деле это не так. Это не всегда очевидно, где хвоствой вызов, и иногда могут быть ошибки.

function f(x) { if (...) { return f(x-1); //хвостовая рекурсия } else { return 0; } } function f(x) { ... return 1 + f(x-1); //не хвостовая рекурсия }
_Winnie C++ Colorizer
Tags:

  • 1
Да, полезная штука. Из существующих вспоминается конструкция recur в clojure, явный tail call.

Немного странный пример, ИМХО. Второй пример при определенных условиях может быть бесконечной рекурсией.

А позвольте, в целях повышения самообразованности: зачем и как на неё полагаться?

(Deleted comment)
Окак. Тересно.
А критично, очевидно, для длинных прогонов?

делается jump, а не call

Да, спасибо. Уже сказали про стек :-))

Ага, в скалах так выглядит
	def fib(n: Int): Int = {
		def square(a: Int): Int = a * a
		@tailrec def fibHelp(a: Int, b: Int, p: Int, q: Int, c: Int): Int =
			if (c == 0) b
			else if (isEven(c))
				fibHelp(a, b, (square(p) + square(q)), (2*p*q + square(q)), c/2)
			else
				fibHelp((b*q + a*q + a*p), (b*p + a*q), p, q, c-1)
		fibHelp(1, 0, 0, 1, n)
	}

Вроде бы кто-то предлагал для этой цели использовать в Яве goto, которое всё равно формально зарезервировано, но не используется.

... До чего же могучий язык! Энтропия невероятная. ...


while (true) { ... continue; ... break;}

  • 1