Рекурсия в быту
От: ё-лка  
Дата: 13.02.04 21:56
Оценка:
Одна из первых рекурсии !! Правда безконечная !
Может где ошибаюсь но по моему так :


char Story () {
    cout << "У попа была собака он её любил \n
             она съела кусок мяса он её убил \n
             и под камень положил \n 
             а на камне написал \n" << Story () ;

    return '\n'    ;
}
Re: Рекурсия в быту
От: Кодт Россия  
Дата: 13.02.04 23:10
Оценка: +1
Здравствуйте, ё-лка, Вы писали:

ЁЛ>
ЁЛ>char Story () {
ЁЛ>    cout << "У попа была собака он её любил \n
ЁЛ>             она съела кусок мяса он её убил \n
ЁЛ>             и под камень положил \n 
ЁЛ>             а на камне написал \n" << Story () ;

ЁЛ>    return '\n'    ;
ЁЛ>}

В данном случае мы стремительно получим переполнение стека, не увидев ни единого слова.
Угадайте, почему?
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[2]: Рекурсия в быту
От: ё-лка  
Дата: 14.02.04 00:07
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, ё-лка, Вы писали:


К>В данном случае мы стремительно получим переполнение стека, не увидев ни единого слова.

К>Угадайте, почему?
К>



Я догадываюсь почему ты так подумал но ты не прав !!!
Откомпилировано и прогнано VC 7.0 всё прекрасно работает не вылитае даже через 10 минут

всё таки iostream -- рулит )
Re[3]: Рекурсия в быту
От: Кодт Россия  
Дата: 14.02.04 00:59
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ>Я догадываюсь почему ты так подумал но ты не прав !!!

ЁЛ>Откомпилировано и прогнано VC 7.0 всё прекрасно работает не вылитае даже через 10 минут

ЁЛ>всё таки iostream -- рулит )


И напротив, откомпилировано и прогнано VC7.1 — и не работает
129254 вложенных вызова без единой строчки наружу.
И я знаю почему. И почему я прав.

А покажи-ка твою main()... сдаётся мне, что ты попросту не вызываешь Story().
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[4]: Рекурсия в быту
От: ё-лка  
Дата: 14.02.04 01:11
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, ё-лка, Вы писали:


ЁЛ>>Я догадываюсь почему ты так подумал но ты не прав !!!

ЁЛ>>Откомпилировано и прогнано VC 7.0 всё прекрасно работает не вылитае даже через 10 минут

ЁЛ>>всё таки iostream -- рулит )


К>И напротив, откомпилировано и прогнано VC7.1 — и не работает

К>129254 вложенных вызова без единой строчки наружу.
К>И я знаю почему. И почему я прав.

К>А покажи-ка твою main()... сдаётся мне, что ты попросту не вызываешь Story().


Вот Работает без проблем и в Дебаг и в релиз версиях ))

#include <iostream>

using namespace std ;


char Sobaka () {
    
    cout << "У попа была собака он её любил \nона съела кусок мяса он её убил \nи под камень положил \n а на камне написал \n" << Sobaka() ;

    return '\n'    ;
}
int main () {

    Sobaka () ;    
        return 0 ;
}
Re[5]: Рекурсия в быту
От: Fomka Россия  
Дата: 14.02.04 01:26
Оценка: :))
Здравствуйте, ё-лка, Вы писали:

К>>А покажи-ка твою main()... сдаётся мне, что ты попросту не вызываешь Story().

ЁЛ>int main () {

ЁЛ>    Sobaka () ;    
ЁЛ>        return 0 ;
ЁЛ>

ЁЛ>


Вот видишь, Story() ты не вызываешь!
Re[6]: Рекурсия в быту
От: ё-лка  
Дата: 14.02.04 01:30
Оценка:
Здравствуйте, Fomka, Вы писали:

F>Здравствуйте, ё-лка, Вы писали:


К>>>А покажи-ка твою main()... сдаётся мне, что ты попросту не вызываешь Story().

F>
ЁЛ>>int main () {

ЁЛ>>    Sobaka () ;    
ЁЛ>>        return 0 ;
ЁЛ>>

ЁЛ>>


F>Вот видишь, Story() ты не вызываешь!


И в правду не вызываю! видать в том то и дело )
Попробую ф-цию Story() назвать может тога вылетем
Re[6]: Рекурсия в быту
От: ё-лка  
Дата: 14.02.04 01:34
Оценка:
Здравствуйте, Fomka, Вы писали:

F>Здравствуйте, ё-лка, Вы писали:


К>>>А покажи-ка твою main()... сдаётся мне, что ты попросту не вызываешь Story().

F>

ЁЛ>>include <iostream>

ЁЛ>>using namespace std ;


ЁЛ>>char Sobaka () {
    
ЁЛ>>    cout << "У попа была собака он её любил \nона съела кусок мяса он её убил \nи под камень положил \n а на камне написал \n" << Sobaka() ;

ЁЛ>>    return '\n'    ;
ЁЛ>>}

ЁЛ>>int main () {

ЁЛ>>    Sobaka () ;    
ЁЛ>>        return 0 ;
ЁЛ>>

ЁЛ>>


F>Вот видишь, Story() ты не вызываешь!


И в правду не вызываю! видать в том то и дело )
Попробую ф-цию Story() назвать может тога вылетет



!
Re: Рекурсия в быту
От: Ivun  
Дата: 14.02.04 03:38
Оценка: +1
Здравствуйте, ё-лка, Вы писали:

ЁЛ>Одна из первых рекурсии !! Правда безконечная !


А зачем рекурсия, если есть очевидное итеративное решение?

while(1) cout << "У попа была собака он её любил \n
                     она съела кусок мяса он её убил \n
                     и под камень закопал \n 
                     а на камне написал \n";
... << RSDN@Home 1.1.0 stable >>
Re[7]: Рекурсия в быту
От: Кодт Россия  
Дата: 14.02.04 09:42
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ> Попробую ф-цию Story() назвать может тога вылетем


Странно всё это. VC71 наглядно показывает, что там происходит.
char fn() { cout << str << fn(); return '\n'; }

развернём выражение... operator<<( operator<<(cout,str), fn() )
поскольку это cdecl функции, получается
call fn
and eax, 000000FFh
push eax ;;; результат функции, он же всегда 0Ah

push addr_of_str
push addr_of_cout
call operator<<
add esp, 8
push eax ;;; результат оператора, == addr_of_cout

call operator<<
add esp, 8
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[5]: Рекурсия в быту
От: dair Россия https://dair.spb.ru
Дата: 14.02.04 10:50
Оценка:
Не знаю, как у вас в виндах:

у меня g++ 3.3.2 (Linux).

Segmentation Fault, ага.



Вообще странно написано, imho — зачем функции возвращать одинокий перевод строки?

я б писал как-нить так:

#include <iostream>
#include <string>

using namespace std;

string Sobaka() {
  string msg( "У попа была собака он её любил\nона съела кусок мяса он её убил\nи под камень положил\n а на камне написал\n" );
  return msg + Sobaka();
}

int main() {
  cout << Sobaka();
}


Правда все равно segfault

А вот так работать будет всегда, как мне кажецца :
void Sobaka() {
  cout << "У попа была собака он её любил\nона съела кусок мяса он её убил\nи под камень положил\n а на камне написал\n";
  Sobaka();
}

int main() {
  Sobaka();
}
Re[2]: Рекурсия в быту
От: Рома Мик Россия http://romamik.com
Дата: 14.02.04 10:52
Оценка:
Здравствуйте, Кодт, Вы писали:

ЁЛ>>
ЁЛ>>char Story () {
ЁЛ>>    cout << "У попа была собака он её любил \n
ЁЛ>>             а на камне написал \n" << Story () ;
ЁЛ>>    return '\n'    ;
ЁЛ>>}

К>В данном случае мы стремительно получим переполнение стека, не увидев ни единого слова.
К>Угадайте, почему?
К>
Порядок расчета аргументов зависит от компилятора. Раскрывается варажение так:
operator << ( operator << ( cout, "" ), Story() )
. А значит
operator << ( cout, "" )
может быть вызван раньше Story().
... << RSDN@Home 1.1.3 beta 1 >>
Re: Рекурсия в быту
От: Древлянин Россия  
Дата: 15.02.04 08:08
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ>
ЁЛ>char Story () {
ЁЛ>    cout << "У попа была собака он её любил \n
ЁЛ>             она съела кусок мяса он её убил \n
ЁЛ>             и под камень положил \n 
ЁЛ>             а на камне написал \n" << Story () ;

ЁЛ>    return '\n'    ;
ЁЛ>}


А зачем return '\n', если он всё равно никогда не будет исполнен?
... << RSDN@Home 1.1.2 stable >>
Re[2]: Рекурсия в быту
От: Кодт Россия  
Дата: 15.02.04 16:46
Оценка:
Здравствуйте, Древлянин, Вы писали:

Д>А зачем return '\n', если он всё равно никогда не будет исполнен?


Важен не предмет, а внимание. Чтобы функция была "правильной" — возвращала хоть что-то.
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[3]: Рекурсия в быту
От: ё-лка  
Дата: 16.02.04 00:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Древлянин, Вы писали:


Д>>А зачем return '\n', если он всё равно никогда не будет исполнен?


К>Важен не предмет, а внимание. Чтобы функция была "правильной" — возвращала хоть что-то.


Ну всё это так сказать для красоты было так как написоно написано а не так хотябы

cout << "lalalaala" ;
Sobaka () ;
Re: Рекурсия в быту
От: DimRus Украина  
Дата: 16.02.04 07:10
Оценка:
Здравствуйте, ё-лка, Вы писали:

ЁЛ>Одна из первых рекурсии !! Правда безконечная !

ЁЛ>Может где ошибаюсь но по моему так :


ЁЛ>
ЁЛ>char Story () {
ЁЛ>    cout << "У попа была собака он её любил \n
ЁЛ>             она съела кусок мяса он её убил \n
ЁЛ>             и под камень положил \n 
ЁЛ>             а на камне написал \n" << Story () ;

ЁЛ>    return '\n'    ;
ЁЛ>}


Возможно, буфер лучше флюшить? Хотя бы endl() вместо последнего '\n'?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.