2010-04-14 114 views
2

謝謝大家的幫助。在這篇文章的下面,我把這兩個腳本的正確版本,現在產生相等的輸出。將Python算法移植到C++ - 不同的解決方案


你好,

我已經寫了一個小畜生串生成腳本在python給定長度內產生一個字母的所有可能的組合。它工作的很好,但因爲我不想更快,所以我嘗試將它移植到C++。

問題是我的C++代碼爲一個單詞創建了太多的組合。 我的繼承人在Python的例子:

./test.py

給我

aaa 
aab 
aac 
aad 
aa 
aba 
....

./test(C++的PROGRAMM給我)

aaa 
aaa 
aaa 
aaa 
aa

在這裏,我還可以得到所有可能的組合,但我經常給他們兩次礦石。

下面是兩個programms的代碼:

#!/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 
$ 

回答

1

我覺得Python代碼也壞了,但也許你不會注意到,因爲print縮進了一個空格太多了(嘿,現在我已經看到一個Python程序帶有一次性錯誤!)

不應該只輸出else情況下的輸出嗎?而輸出更頻繁的原因是您撥打print/cout 4次。我建議更改代碼:

def rec(w, p, baseString): 
    if w == p: 
     print baseString 
    else: 
     for ... 
+0

謝謝,我沒有注意到蟒蛇也被打破了。 而且輸出也是錯位的:( 它應該只打印一次而不是每次迭代(謝謝) – cb0 2010-04-14 15:20:02

0

rec字符串p被印在循環的每次迭代:

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

的Python代碼似乎做同樣的,但也許有有什麼東西與那裏的縮進混在一起?您是否可能在Python文件中混合了製表符和空格,導致令人驚訝的結果?

+0

感謝那一點 我沒有看到我在循環語句中調用輸出。 – cb0 2010-04-14 15:21:01

0

你說...:

./test.py

給我

AAA AAB

(ETC),但這不是真正你發佈的代碼:你得到的是

aa 
aa 
aa 
aa 
a 

四個重複的領先的aa等等等等。當然你可以這樣做:你在for c in "abcd":循環內有print baseString聲明,所以必須執行四次。我想你想要循環中的print列出 - 對於C++代碼也是如此,您還將輸出語句smack放入循環中,以便重複使用。

+0

謝謝,循環內的打印是我的錯誤 我想知道爲什麼test.py會給你不同的輸出,我再次測試它,並且我得到了aaa,aab等等...... 我是運行OS X,Python 2.6.4 – cb0 2010-04-14 15:23:33

1

出於好奇,這足夠快嗎? (並確保你將輸出重定向到一個文件;在屏幕上滾動大量文本可能會令人驚訝地慢)。

+0

我不知道itertools.procuct,我試過itertools.permutations,但這當然不是我所需要的。 這個解決方案非常快,但不像C++那麼快代碼 謝謝你 – cb0 2010-04-14 15:28:33