Портирование алгоритма Python на C ++ - другое решение - PullRequest
2 голосов
/ 14 апреля 2010

Спасибо всем за помощь. Ниже этого поста я поместил исправленные версии обоих скриптов, которые теперь дают одинаковый результат.


Здравствуйте,

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

Проблема в том, что мой код C ++ создает слишком много комбинаций для одного слова. Вот мой пример в Python:

./test.py

дает мне

aaa
aab
aac
aad
aa
aba
....

, в то время как ./test (мне дает программа на С ++)

aaa
aaa
aaa
aaa
aa

Здесь я также получаю все возможные комбинации, но получаю их вдвое чаще.

Вот код для обеих программ:

 #!/usr/bin/env python
 import sys
 #Brute String Generator
 #Start it with ./brutestringer.py 4 6 "abcdefghijklmnopqrstuvwxyz1234567890" ""
 #will produce all strings with length 4 to 6 and chars from a to z and numbers 0 to 9
 def rec(w, p, baseString):
    for c in "abcd":
        if (p<w - 1):
            rec(w, p + 1, baseString + "%c" % c)
         print baseString

 for b in range(3,4):
     rec(b, 0, "")

А вот код C ++

 #include <iostream>
 using namespace std;
 string chars="abcd";

 void rec(int w,int b,string p){
    unsigned int i;
    for(i=0;i<chars.size();i++){
        if(b < (w-1)){
            rec(w, (b+1), p+chars[i]);
        }
        cout <<  p << "\n"; 
    }
 }


 int main ()
 {
    int a=3, b=0;
    rec (a+1,b, "");
    return 0;
 }

Кто-нибудь видит мою ошибку? У меня нет большого опыта работы с C ++.

Спасибо, действительно


Вот исправленная версия:

C ++

#include <iostream>
using namespace std;
string chars="abcd";

void rec(int w,int b,string p){
    unsigned int i;
    for(i=0;i<chars.size();i++){
        if(b < (w)){
            rec(w, (b+1), p+chars[i]);
        }
    }
    cout << p << "\n";
}


int main ()
{
    rec (3,0, "");
    return 0;
}

Python

#!/usr/bin/env python
import sys

def rec(w, b, p):
    for c in "abcd":
        if (b < w - 1):
            rec(w, b + 1, p + "%c" % c)
    print p

rec(4, 0, "")

Равный вывод:

$ ./test > 1
$ ./test.py 3 3 "abcd" "" > 2
$ diff 1 2
$ 

Ответы [ 4 ]

1 голос
/ 14 апреля 2010

Просто из любопытства, это достаточно быстро?

import itertools, string
alphabet = string.lowercase + string.digits
for numchars in (3, 4):
    for x in itertools.product(alphabet, repeat=numchars):
        print ''.join(x)

(и убедитесь, что вы перенаправляете вывод в файл; прокрутка огромного количества текста на экране может быть на удивление медленной).

1 голос
/ 14 апреля 2010

Я думаю, что код Python также не работает, но, может быть, вы не заметите, потому что print имеет отступ на один пробел слишком много (эй, теперь я видел программу на Python с одноразовой ошибкой!)

Разве вывод не должен происходить только в случае else? И причина, по которой вывод происходит чаще, состоит в том, что вы звоните print / cout 4 раза. Я предлагаю изменить код:

def rec(w, p, baseString):
    if w == p:
        print baseString
    else:
        for ...
0 голосов
/ 14 апреля 2010

Вы говорите ...:

. / Test.py

дает мне

ааа ааЪ

(и т. Д.), Но это не относится к опубликованному вами коду: вместо этого вы получаете

aa
aa
aa
aa
a

с четырьмя повторениями ведущего aa и т. Д. И т. Д. Конечно, вы делаете: у вас есть оператор print baseString внутри цикла for c in "abcd":, поэтому он обязательно выполняется четыре раза. Я предполагаю, что вы хотите, чтобы print из цикла - и аналогично для кода C ++, где вы также помещаете оператор вывода в цикл, чтобы он повторялся.

0 голосов
/ 14 апреля 2010

В rec строка p печатается на каждой итерации цикла:

for(i=0;i<chars.size();i++){
    // ...
    cout <<  p << "\n"; 
}

Код Python, который вы разместили, похоже, делает то же самое, но, может быть, там есть что-то смешанное с отступом? Возможно, вы смешивали табуляции и пробелы в файле Python, что привело к удивительным результатам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...