Рекурсивная функция создания последовательности из массива

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

Вопрос ещё актуален.


SiniySentin, я не понимаю, в чем проблема? просто берешь числа рандомом и через проверку и деление (+ деления с остатком) проверяешь подойдет ли число


k0vpack, собственно, в чем моя проблема. Функцию на проверку первой цифры и последнюю я сделал. Я не знаю как проштрудировать массив (через циклы у меня не получилось) так, чтобы он не выводил, к примеру, два раза одно и то же число (даже если оно подходит по условию).


SiniySentin,
два раза одно и то же число
проганяешь проверкой по циклу это число в случае если есть такое делаешь операцию по новой


если массив структур запрещен, то параллельный массив флагов использования


k0vpack, так, а что в саму функцию загонять? Проверять элементы попарно или целый массив? У меня вот как будто на уме вертится, реализовать не могу.


SiniySentin, массив очень большой будет?


SiniySentin, массив то есть?


Biger18, k0vpack, да хотя бы на 20-ти элементах протестировать.


struct num{ int n,use; };
void order(num *a,int prev,int you,int n)
{
    char c,s[10];
    if(prev>=0) c=a[prev].n%10+'0';
    int was=0;
    for(int i=0; i<n; i++)
        if(a[i].use<0 &&(prev<0 || c==*itoa(a[i].n,s,10)))
        {
            a[i].use=you;
            order(a,i,you+1,n);
            a[i].use=-1;
            was=1;
        }
    if(!was)
    {
        int i;
        for(i=0; i<n; i++)
            if(a[i].use==1) break;
        if(i<n)
        {
            for(int i=0; ;i++)
            {
                int k;
                for(k=0; k<n; k++)
                    if(a[k].use==i)
                    {
                        cout<<a[k].n<<" ";
                        break;
                    }
                if(k==n) break;
            }
            cout<<endl;
        }
    }
}
void main(int argc,char **argv)
{
    int n=15;
    num *a=new num[n];
    srand((unsigned)time(0));
    for(int i=0; i<n; i++)
    {
        a[i].n=rand()%100;
        a[i].use=-1;
        cout<<a[i].n<<" ";
    }
    cout<<"\n\n";
    order(a,-1,0,n);
    delete[] a;
n-количество


Biger18, вот и я сделал что-то подобное, только с доп. массивом "флагов" использования. Но рекурсия так некуда и не впихнулась.Biger18, спасибо вам большое.


так проще
void order(num *a,int prev,int you,int n)
{
    char c,s[10];
    if(prev>=0) c=a[prev].n%10+'0';
    int was=0;
    for(int i=0; i<n; i++)
        if(a[i].use<0 &&(prev<0 || c==*itoa(a[i].n,s,10)))
        {
            a[i].use=you;
            order(a,i,you+1,n);
            a[i].use=-1;
            was=1;
        }
    if(!was && you>2)
    {
        for(int i=0; i<you; i++)
            for(int k=0; k<n; k++)
                if(a[k].use==i)
                {
                    cout<<a[k].n<<" ";
                    break;
                }
        cout<<endl;
    }
}


Biger18, ах да, ещё... Вот сейчас проверять начал и в VS *itoa выдаёт C4996 ошибку. Знаю, что это такое и вот вопрос: отключить это предупреждение или заменить itoa на другую функцию?


у меня варнинг, дело хозяйское