LINUX.ORG.RU

Для того, чтобы понять рекурсию, надо понять рекурсию (шутка).


0

0

При запуске такой функции на определенной (примерно 357-тысячной) вложенности программа сегфолится.
void s()
{
s();
}

Вопрос: почему? как обработать ошибку "невозможно вызвать ф-ю рекурсивно"?

anonymous

Р ССССС РСРРСС ССРССР РСССССРСРРР, РСРРС СС СССРСС?

ССС ССРСССРСРР СРС РРСССССССС? ССРСС РСРРС РРСРСРСРСРТ ССРСССССРТ - ССССР РССРРРСС С СРСРСРРРР

hapchu ★★
()

у меня вывалилась на 524087 Ж))а, а вообще ты врятли её сможешь обработать, просто потому что не бывает таких обработчиков

anonymous
()

почему? - дык память-то не безгранична, а при каждом рекурсивном вызове функции, добавляется есчо одна функция на стэк, со всеми вытекающеми последсвиями.

anonymous
()
Ответ на: комментарий от anonymous

> у меня вывалилась на 524087
А у меня не вываливается. С  -O3 компилировал. В принципе - НЕ должно вываливаться - из-за tail recursion. Короче - см код проги

	.file	"foo.c"
	.text
	.p2align 4,,15
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	call	s
	movl	%ebp, %esp
	popl	%ebp
	ret
	.size	main, .-main
	.p2align 4,,15
.globl s
	.type	s, @function
s:
	pushl	%ebp
	movl	%esp, %ebp
	.p2align 4,,15
.L4:
	jmp	.L4
	.size	s, .-s
	.section	.note.GNU-stack,"",@progbits
	.ident	"GCC: (GNU) 3.3.3"

Begemoth ★★★★★
()

Как тут верно заметили дело в стеке.

Ubnormal
()
Ответ на: комментарий от Begemoth

> А у меня не вываливается. С -O3 компилировал. В принципе - НЕ должно вываливаться - из-за tail recursion.

Логичный вывод: -O3 включает оптимизацию tail recursion. Потому и не кусают.

С уважением -- Смоляное Чучелко

anonymous
()
Ответ на: комментарий от anonymous

Вывод логичный. И в документации по gcc это написано, что и подтверждает приведенный ассемблерный код.

Begemoth ★★★★★
()

Вот потому рекурсия и отстой что обработать ситуацию когда кончится стек
невозможно. Однако выход есть: любую рекурсию можно переписать используя свой программный стек.
Юзайте std::stack или std::list и будет вам счастье !

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.