Форум программистов, компьютерный форум CyberForum.ru

Чем отличается хвостовая рекурсия от обычной рекурсии? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Цикл с предусловием.Найдите все симметричные палиндромы из интервала [1000000, 1000000000] http://www.cyberforum.ru/cpp-beginners/thread758256.html
Найдите все симметричные палиндромы из интервала . Объяснение: палиндром - это число, которое читается одинаково справа налево и слева направо, то есть именно число равно перевернутом числу.
C++ Деструктор и _Block_Type_Is_Valid (pHead->nBlockUse) Приветствую! Встретился сегодня с такой проблемой. Есть функция, которая возвращает объект. При выходе из функции появляется ошибка _Block_Type_Is_Valid (pHead->nBlockUse). Я посмотрел и понял, что ошибка появляется при вызове деструктора. Почему так происходит? Код функции и класса: #pragma once #include <string.h> template <typename tt> class ss_v_stack { tt * A; tt * As; http://www.cyberforum.ru/cpp-beginners/thread758252.html
Разделить программу на файлы C++
Помогите мне разделить программу на три файла: сам класс, функции к нему, и функция main. Сам класс #ifndef ARRAY1_H #define ARRAY1_H #include <iostream.h> class Array{ friend ostream &operator<<(ostream &, Array &);
do while фунция C++
Здравствуйте, вот есть код приведенный ниже,прости те за культуру написания, но суть задания в том чтобы выполнить do while с вычислением ещё 1 раз, учитывая условия. // 3.2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "math.h" #include "iostream" using namespace std;
C++ Уроки WIndows Form Aplications (БЕСПЛАТНО) http://www.cyberforum.ru/cpp-beginners/thread758242.html
Дайте ссылку на сайт с хорошими видео-уроками по WIndows Form Aplications ( Visual Studio 2010 C++) Буду сильно благодарен!
C++ Упорядочить элементы стека методом выбора с обменами #include "stdio.h" #include "iostream" #include "stack" using namespace std; int main() { stack<int> S1; подробнее

Показать сообщение отдельно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 09:39     Чем отличается хвостовая рекурсия от обычной рекурсии?
На самом деле на википедии какая-то лажа. Суть хвостовой рекурсии (помимо всего вышесказанного) в том, что она возвращает результат непосредственно в точку вызова функции, при использовании хвостовой рекурсии не происходит "забивание" стека адресами возврата, поэтому переполнение стека не возможно по определению. На языках С/С++ адрес возврата кладется на стек при каждом вызове функции, т.е. пример выше все же может привести к переполнению стека, а возвращаемое значение пройдет через все вызовы функции. Таким образом т.н. хвостовая рекурсия невозможно на языках С/С++ в силу организации языка. Может быть компилятор сможет ее оптимизировать до "настоящей" хвостовой рекурсии, но это ни где не прописано и ни кем не гарантированно.

Вот такой пример вылетает из-за переполнения стека
C++
1
2
3
4
5
6
7
8
9
10
int f (int n)
{
  if (n == -1) return n;
  return f(++n);
}
 
int main()
{
  f(0);  
}
хотя свиду это та самая хвостовая рекурсия.
Bash
1
2
3
 g++ -O0 tmp.cpp 
 ./a.out 
Segmentation fault (core dumped)
 
Текущее время: 12:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru