Выход из рекурсивной функции на высшем уровне в C ++ - PullRequest
2 голосов
/ 11 мая 2010

Скажите, что вы на несколько уровней глубоко в рекурсивной функции. Функция изначально была вызвана в main. Есть ли у вас способ выйти из рекурсии и вернуться прямо к основному, не выполняя все остальные функции выше?

Ответы [ 7 ]

9 голосов
/ 11 мая 2010

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

4 голосов
/ 11 мая 2010

В C вы можете использовать longjmp / setjmp для этого, но я не думаю, что это безопасно использовать в C ++ (минуя деструкторы?). Вам, вероятно, придется использовать исключения.

2 голосов
/ 11 мая 2010

Сделайте вашу функцию так, чтобы она была оптимизирована. Тогда нет никаких «функций над», о которых нужно беспокоиться.

2 голосов
/ 11 мая 2010

Вопрос в том, как ты туда попал? Какой алгоритм погружает вас в рекурсию без возможности выбраться из нее?

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

Если вы в отчаянии, исключение - это путь, но это (справедливо, IMO) не одобряется.

2 голосов
/ 11 мая 2010

Вы можете получить расположение за стеком и использовать ассемблер для jmp к нему, но зачем вам это нужно?

Также вы должны учесть, что когда вы перейдете на пастбище, кто-то другой должен будет его поддерживать.

1 голос
/ 11 мая 2010

Нет, вы не можете выйти из своей рекурсии и вернуться обратно к своей главной (). Если ваша рекурсивная функция не выполняет другую работу после рекурсивного вызова, вы бы эффективно выполнили то же самое. Я рекомендую реструктурировать вашу рекурсивную функцию. Описание того, почему вы хотите отказаться от рекурсии раньше, также будет полезно.

0 голосов
/ 28 апреля 2015

У меня такая же проблема в алгоритме возврата nqueens.

Самый простой способ - добавить глобальную логическую переменную и использовать ее для предотвращения любых дальнейших действий в ваших родительских функциях.

...