Информатика и технология программирования


Результат функции рекурсивного поиска - часть 3


{
char *pw,*pp; int l;
if (*w[n]==0) continue;
if ((l=TEST(lw,w[n]))!=-1)
{
pw=w[n];
w[n]="";
if ((pp=step(pw))!=NULL)
{
s=new char[l+strlen(pp)];
strcpy(s,lw);
str cat(s +l,pp);
delete pp;
if (smin==NULL) smin=s; else
if (strlen(smin)&#62strlen(s))
{ delete smin; smin=s; }
}
w[n]=pw;
}
}
return smin;
}


void main() { cout &#60&#60 step("");}

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


//------------------------------------------------------bk54-05.cpp


&#35include &#60iostream.h&#62
&#35include &#60string.h&#62
char *w[]={"bba","abb","ba",NULL};


int TEST(char *s, char *r)
{
int n,k;
k=n=strlen(s);
if (n==0) return 0;
for (;*s!=0 &#38&#38 n&#62 0; s++,n--)
if (strncmp(s,r,n)==0) return k-n;
return -1;
}


&#35define SZ 80
struct string
{
int null; // Признак строка пустая


char str[SZ]; // Строка ограниченной длины


};
string step(char *lw) // Функция возвращает структуру как результат


{ int n;
string s,smin; // Локальные переменные - структуры


for (n=0; w[n]!=NULL;n++)
if (*w[n]!=0) break;
if (w[n]==NULL) // Последняя строка


{ s.null=0; strcpy(s .str,lw); return s; }
smin.null =1; // Признак строка еще пока пустая


for (n=0; w[n]!=NULL;n++)
{
char *pw; int l;
string pp; // Результат рекурсивного вызова


if (*w[n]==0) continue;
if ((l=TEST(lw,w[n]))!=-1)
{
pw=w[n];
w[n]="";
pp=step(pw) ; // Рекурсивная функция возвращает


if (!pp.null) // структурированную переменную


{ // За распределением памяти под


s.null=0; // структурированные переменные


strcpy(s .str,lw); // не следим


strcat(s.str,pp .str);
if (smin. null) smin=s; else
if (strlen(smin .str)&#62strlen(s .str))
smin=s; // Прямое присваивание структур


}
w[n]=pw;
}
}
return smin;
}
void main() { cout &#60&#60 step("") .str;}




Начало  Назад  Вперед



Книжный магазин