GopSwap -- очень рекурсивная программа
От: Erop Россия  
Дата: 15.04.05 11:40
Оценка: 5 (1) :))
Вот.
Как-то написал один чел рекурсивную программу.

Он в ней ошибся, кстати


Собственно два вопроса:

1) Что должна была делать функция GopSwap
2) Где и какая ошиька?


/*    Пример того, как не надо писать читабельные программы    */    
        
/*    В этой переменной лежит второй результат ReplWordPos    */
static int ResultLen;    

static int iMax(int i1, int i2)
{    
    return i1 > i2 ? i1 : i2;
}    

static BOOL cEqu(char c1, char c2)
{    
    return c1 == c2;
}    

/*    Кусок функции iter */
#define _iter_(fn, a, len, s, sh, res) \
    iter(fn, a + len - len / 2, len / 2, s, sh, iter(fn, a, len / 2, s, sh, res))

/*    Несомненно iter -- это самая важная функция в этом файле.    */
static int iter(int (*fn)(int, char*, int, int), int a, int len, char* s, int sh, int res)
{    
    assert(len >= 0);
    return (len - len / 2 > len / 2) ? (*fn)(a + len / 2, s, sh, _iter_(fn, a, len, s, sh, res))
                                     : len > 0 ? _iter_(fn, a, len, s, sh, res) 
                                               : res;
}    

static int smLen(int i, char* s, int sh, int res)    
{    
    return (!cEqu(s[i], s[i + sh]) && i < res) ? i : res;
}    

static int smWrd(int i, char* s, int len, int res)    
{
    return i == 0 ? res : iMax(res, iter(smLen, 0, len - i, s, i, len - i));    
}    


static int smWdth(int i, char* s, int len, int res)
{    
    return iter(smLen, 0, len, s, i, len) == len ? i : res;
}    

static int resLen(int i, char* s, int len, int res)
{    
    return iter(smWrd, 0, len - i, s + i, len - i, res);
}    

static int resPos(int i, char* s, int len, int res)
{    
    return iter(smWdth, 0, len  - ResultLen  - i, s + i, ResultLen, res);
}    

/*    Возвращает пару чисел, одно как значение, а другое в ResultLen, но вот что это за числа?    */
static    int ReplWordPos(char* str, int len)
{    
    len -= (ResultLen = iter(resLen, 0, len, str, len, 0));
    return iter(resPos, 0, len, str, len, 0);
}    

static int gopSwap(int i, char* s, int what, int res)
{    
    s[i] = (char)what;
    return res;
}    

/*    Что делает эта функция?    */
void GopSwap(char* str)
{    
    str += ReplWordPos(str, strlen(str));
    iter(gopSwap, 0, ResultLen, str, '*', 0);
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.