Проблемы с рекурсией в Си
От: Аноним  
Дата: 09.03.03 18:52
Оценка:
Делаю в программе рекурсивынй переворот так :
void revers(char *str,int len)
{ static i;
  char c;
c=*(str+i++);
if (c) revers(str,len);
else return;
*(str+len-(--i))=c;
}

работает намана, НО после 2 вызова уже идут ошибки, почему ?

12.03.03 02:28: Перенесено модератором из 'Delphi & Builder' — H_D
Re: Проблемы с рекурсией в Си
От: IT Россия linq2db.com
Дата: 09.03.03 18:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>работает намана, НО после 2 вызова уже идут ошибки, почему ?


Потому что i перед каждым вызовом хорошо бы обнулить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Проблемы с рекурсией в Си
От: Аноним  
Дата: 09.03.03 19:09
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


А>>работает намана, НО после 2 вызова уже идут ошибки, почему ?


IT>Потому что i перед каждым вызовом хорошо бы обнулить.


так static по ходу сам это делает.
Re[3]: Проблемы с рекурсией в Си
От: IT Россия linq2db.com
Дата: 09.03.03 19:26
Оценка:
Здравствуйте, Аноним, Вы писали:

IT>>Потому что i перед каждым вызовом хорошо бы обнулить.


А>так static по ходу сам это делает.


Ну да, один раз при первом вызове продцедуры. Погоняй отладчиком сам всё увидишь.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Проблемы с рекурсией в Си
От: Аноним  
Дата: 09.03.03 19:40
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


IT>>>Потому что i перед каждым вызовом хорошо бы обнулить.


А>>так static по ходу сам это делает.


IT>Ну да, один раз при первом вызове продцедуры. Погоняй отладчиком сам всё увидишь.


нифика не помогает
Re: Проблемы с рекурсией в Си
От: Radich  
Дата: 09.03.03 19:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делаю в программе рекурсивынй переворот так :

А>
А>void revers(char *str,int len)
А>{ static i;
А>  char c;
А>c=*(str+i++);
А>if (c) revers(str,len);
А>else return;
А>*(str+len-(--i))=c;
А>}
А>

А>работает намана, НО после 2 вызова уже идут ошибки, почему ?

Да, статическая переменная, конечно сбрасывается в 0 при запуске программы. но больше она в 0 сбрасываться не будет, а после первого выхова она будет равна не 0, а 1..., после второго — 2 и т.д....
Убедитесь в этом, использовав отладчик.

А вообще, я бы не мучился и написал так:

void revers(char *str,int len)
{
    char* szTemp = new char[len];
    strcpy(szTemp, str);
    for (int i = 0; i < len; i++)
        str[i] = szTemp[len-i-1];
}
Re[2]: Проблемы с рекурсией в Си
От: Владик Россия  
Дата: 11.03.03 09:13
Оценка:
Здравствуйте, Radich, Вы писали:

R>А вообще, я бы не мучился и написал так:


R>
R>void revers(char *str,int len)
R>{
R>    char* szTemp = new char[len];

А delete кто делать будет? И, главное, нафига здесь вообще дополнительные буфера?

[ccode]
void revers(char *str,int len)
{
    for (int i = 0; i < len/2; i++)
    {
     char swp=str[i];
          str[i] = str[len-i-1];
          str[len-i-1]=swp;
    }
}
Как все запущенно...
Re[3]: Проблемы с рекурсией в Си
От: Radich  
Дата: 11.03.03 16:09
Оценка:
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, Radich, Вы писали:


R>>А вообще, я бы не мучился и написал так:


R>>
R>>void revers(char *str,int len)
R>>{
R>>    char* szTemp = new char[len];

В>А delete кто делать будет? И, главное, нафига здесь вообще дополнительные буфера?

В>[ccode]
В>void revers(char *str,int len)
В>{
В>    for (int i = 0; i < len/2; i++)
В>    {
В>     char swp=str[i];
В>          str[i] = str[len-i-1];
В>          str[len-i-1]=swp;
В>    }
В>}
В>


delete — согласен, забыл. Вообще-то всего-навсего показать то, что рекурсия тут ни к чему, а не продемонстрировать супер-правильный и супер-эффективный код.
А вот на счет буффера — ваше замечание совершенно безосновательное.
Т.к. вся выгода от отсутствия буффера с лихвой компенсируется тем, что у вас в цикле 3 операции вместо 1 у меня.

P.S. Да... Билдеровский форум — это что-то....
Re[4]: Проблемы с рекурсией в Си
От: Аноним  
Дата: 11.03.03 19:03
Оценка:
Здравствуйте, Radich, Вы писали:

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


В>>Здравствуйте, Radich, Вы писали:


R>>>А вообще, я бы не мучился и написал так:


[----]

R>delete — согласен, забыл. Вообще-то всего-навсего показать то, что рекурсия тут ни к чему, а не продемонстрировать супер-правильный и супер-эффективный код.


да вообщето надо только рекурсия, а так делать нех ...
Re: Проблемы с рекурсией в Си
От: yorge Узбекистан  
Дата: 12.03.03 08:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делаю в программе рекурсивынй переворот так :

А>
А>void revers(char *str,int len)
А>{ static i;
А>  char c;
А>c=*(str+i++);
А>if (c) revers(str,len);
А>else return;
А>*(str+len-(--i))=c;
А>}
А>

А>работает намана, НО после 2 вызова уже идут ошибки, почему ?

Насчет статической переменной и ее инициализации думаю уже все понятно.

А реализовать можно, например, так
/*h*/
void revers(char *str, int len, int i=0);

/*c*/
void revers(char *str, int len, int i)
{  
  char c;
  c=*(str+i++);
  if (c) 
    revers(str,len, i);
  else 
    return;
  *(str+len-(--i))=c;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.