2010-04-14 113 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