singlepost

Помогите исправить: буквенная рекурсия, С++ << На главную или назад  

и снова я предлагаю вам сыграть в игру "найдите гавнокод"
цель: вывести все слова с перебранными буквами, как то
ввод: asd
вывод:
asd
ads
sad
sda
das
dsa

//dumpz.org/16512/

выдает одиночные буковки и двойные, чего, впринципе, быть не должно.
я не вкуриваю, почему.
помогите, пожалуйста) с рекурсией сталкиваюсь во второй раз)

37 ответов в теме “Помогите исправить: буквенная рекурсия, С++”

  1. 26
    Александр Лищенер ответил:

    я тоже школьник ;)
    я имею ввиду нарицательное))))

  2. 25
    Михаил Асташкевич ответил:

    Ой=))

  3. 24
    Алексей Боголюбский ответил:

    что значит очередной школьник?!
    я тоже школьник!

  4. 23
    Алексей Боголюбский ответил:

    какую табличку?

  5. 22
    Александр Лищенер ответил:

    Алексей, не обращайте внимания, это очередной школьник.
    Антон, вы не в ту группу обратились.

  6. 21
    Антон Холоденко ответил:

    Поставте табличку ! Плиз !

  7. 20
    Алексей Боголюбский ответил:

    забыл про эту функцию=))))

  8. 19
    Александр Лищенер ответил:

    ахаххахаха))

  9. 18
    Андрей Горбоконь ответил:

    #include <algorithm>
    #include <string>
    #include <iostream>
    using namespace std;
    int main()
    {
    __ string a = "abc";
    __bool res = true;
    __while(res)
    __{
    ____res = next_permutation(a.begin(), a.end());
    ____cout<<a<<endl;
    __}
    }

  10. 17
    Александр Лищенер ответил:

    красивее, только я хотел освоить рекурсию, а не красоту ;)

  11. 16
    Николай Немов ответил:

    #10) Переделать из циферок в буковки конечно невыполнимая задача…
    Если делать без повторов то и должно быть n!
    123
    132
    213
    231
    312
    321
    3! = 6
    В #1) для 3-ех букв тоже выдается 6 строк.
    А насчет того, что я без рекурсии, это да, виноват) Но согласитесь, такой код красивее)

  12. 15
    Александр Лищенер ответил:

    ошибку у себя понял, еще одну…

  13. 14
    Александр Лищенер ответил:

    Михаил, Алексей, спасибо, я понял, как вы сделали…
    просто я хотел вместо стирания последней буквы проходить циклом, прибавляя каждую букву, а когда буквы станут максимальными, стирать основное слово, куда все и записывается.
    ваше решение лучше, однозначно.

    зы. про флажки – так надежнее хД
    кстати, gcc только глобальным переменным дает 0, или всем, или всем дает мусор?

  14. 13
    Алексей Боголюбский ответил:

    я делал с помощью твоего исходника, я не понимаю зачем там string, ну это ладно.
    я прокомментирую немного свой код.
    во первых глобальные переменные (массив) типа bool специализируются значениями false. (в ручную можно не делать)
    current_word+=word[i];-прибавляем в конец символ
    used[i]=true; -ставим "флаг" в позицию, говорящую о том, что дальше в ЭТОЙ перестановке этот элемент нельзя использовать.
    recursion(current_length+1);- доделываем ЭТУ перестановку
    current_word.erase(current_word.end()-1,current_word.end());- удаляем символ, который мы поставили (последний)
    used[i]=false;- возвращаем флаг на позицию в которой мы можем использовать в дальнейшем данный элемент.

  15. 12
    Алексей Боголюбский ответил:

    как то так=)

  16. 11
    Михаил Асташкевич ответил:

    Александр, там просто сама идея немного неправильная.

    Есть слово. Ты к нему прибавляешь неиспользованную букву, помечаешь ее, запускаешь рекурсию, а потом удаляешь эту букву, и помечаешь е, как неиспользованную.

    Соответственно, если дошел до конца строки, то просто выводишь ее и не надо ничего делать ни со строкой, ни с пометками

  17. 10
    Михаил Асташкевич ответил:

    Николай, ты, кажись, что-то путаешь. Выводить буковки надо, это раз, во-вторых кол-во строк будет n!, а не 2^n

    1<<y&i -(2^y and i), где and – побитовое и

  18. 9
    Александр Лищенер ответил:

    угу.
    может кто-нибудь объяснить, в чем ошибка в моем коде?
    я покурил код Алексея, вроде нормально… но почему сам ошибся, не разобрался. тупой…?

  19. 8
    Александр Лищенер ответил:

    смысл был в рекурсии.
    что значит 1<<y&i?

  20. 7
    Николай Немов ответил:

    а, так надо без повторений, тогда в сто раз проще

    int i,y;
    for(i=0;i<pow(2,3);i++)
    {
    for(y=0;y<3;y++)
    {
    if(1<<y&i)
    {
    printf("%d ",y);
    }
    }
    printf("\n");
    }

  21. 6
    Александр Лищенер ответил:

    спасибо, там без повторений.
    а почему у меня неправильно, можешь сказать? или код настолько быдлянский, что разобраться сложно?

  22. 5
    Алексей Боголюбский ответил:

    //dumpz.org/16525/
    это если не встречается повторений.

  23. 4
    Александр Лищенер ответил:

    у тебя неправильный код…

  24. 3
    Александр Лищенер ответил:

    честно говоря, не понял до конца. можешь указать ошибки в коде?

  25. 2
    Николай Немов ответил:

    #include<iostream>
    int mas[999],m[999],N;
    void permut(int num,int L)
    {
    int i;
    if(num==L)
    {
    for(i=0;i<L;i++) printf("%d ",m[i]);
    printf("\n");
    return;
    }
    for(i=0;i<N;i++)
    {
    m[num]=mas[i];
    permut(num+1,L);
    }
    return;
    }
    void main()
    {
    N=3;
    for(int i=1;i<=N;i++) mas[i-1]=i;
    for(int L=1;L<=N;L++) permut(0,L);
    }

    Пляши от этого
    В мэине убрать второй цикл и будут только последовательности одной длины.

  26. 1
    Александр Лищенер ответил:

    нашел то, что не помечал флажки.
    исправил, выводит еще более херню.
    //dumpz.org/16519/

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.