Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2012, 13:50   #1
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию Почему вылетает программа с рекурсией?

Код:
#include <stdio.h>

int rekursiya()
{
printf("Теперь и ты знаешь, что такое рекурсия");
rekursiya();
return 0;
}
main()
{
printf("Теперь и ты знаешь, что такое рекурсия");
rekursiya();
}
Написал ради интереса Но почему-то этот код у меня работает всего 4 секунды, а потом вылетает с ошибкой, я думал, что прога просто зациклится, и будет выполняться безконечно, разве это не так должно быть?
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 25.12.2012, 14:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
разве это не так должно быть?
Так оно и происходит. Просто твоей проге стека не хватает на бесконечную работу (это си а не ЛИСП все таки). Потому когда у проги заканчивается память ее ОСь выкидывает нафик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.12.2012, 15:08   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
я думал, что прога просто зациклится, и будет выполняться бесконечно, разве это не так должно быть?
Нет. Следите за руками: когда Вы вызываете rekursiya, должна создаться так называемая "запись активации" функции. Она занимает ненулевое место в памяти компьютера и уничтожается при выходе из функции. Вы входите, входите и не выходите, память кончается. Упс.
Добавим наглядности:
Код:
int rekursiya(int arg)
{
printf("Теперь и ты знаешь, что такое рекурсия (%d)", arg);
rekursiya(arg+1);
return arg;
}
Переменная arg "одна" - в том смысле, что она объявляется в одной строке кода. Но при разных вызовах rekursiya() она принимает разные значения; причём - обратите внимание! - это может быть одновременно: в один момент работы программы могут существовать несколько разных переменных arg, каждая из которых имеет своё значение, хотя все они - переменная arg из функции rekursiya(). То есть, одно имя соответствует нескольким значениям, каждое из которых задаётся в соответствующей записи активации.

В некоторых случаях запись активации можно считать вырожденной - скажем, в Вашем изначальном примере все вызовы функции rekursiya() в каком-то смысле "одинаковы". Тогда, теоретически, можно оптимизировать запись активации до нулевого размера, и число вызовов функции перестанет быть ограниченным количеством доступной памяти. Практически компиляторы C++ этим не занимаются.
Также можно уничтожать запись активации до момента "выхода из функции" по стандарту языка. Скажем:
Код:
int rekursiya()
{
printf("Теперь и ты знаешь, что такое рекурсия");
return rekursiya();
}
Формально, выход из функции (и уничтожение записи активации) должны произойти после того, как завершится и вернёт результат внутренний вызов rekursiya() (читай - никогда). Однако, поскольку всё, что надо сделать с возвращённым этим подвызовом значением - вернуть его "наверх", то возможно уничтожить запись активации перед вызовом вложенной rekursiya(). Такая оптимизация называется "оптимизацией хвостовой рекурсии (tail recursion optimization)" и, если не изменяет память, поддерживается некоторыми компиляторами при соответствующих настройках.
Abstraction вне форума Ответить с цитированием
Старый 25.12.2012, 15:43   #4
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Спасибо, теперь понятно))
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 25.12.2012, 18:05   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Что бы понять рекурсию, нужно понять рекурсию...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему программа вылетает? [C] Stasy_BMT Помощь студентам 1 09.06.2012 14:24
почему вылетает игра? blacktener Общие вопросы C/C++ 5 21.07.2011 23:50
Почему вылетает ошибка Read beyond end of file? KoBRaAndrey Общие вопросы Delphi 4 24.01.2010 11:24
не могу найти почему вылетает прога Андрей Куб Общие вопросы Delphi 19 28.04.2009 06:54
Не могу понять почему вылетает 3 процедурка, помогите Taisja Помощь студентам 2 04.06.2008 21:28