我试图使用递归方法anagram()返回字符串的所有排列。对于任何单词“ABCD ... N”,该函数在anagram(“BCD ... N”)内尽可能多的位置返回一个字母“A”的列表。递归的限制情况是,如果参数的大小为2(例如:“XY”),则返回['XY','YX']。
代码如下:
def anagram(block):
if (len(block) <= 2):
permu=list()
permu.append(block[0]+block[1])
permu.append(block[1]+block[0])
else:
permu=list()
lowerpermu=anagram(block[1:]) # anag(sd)
for blocklet in lowerpermu: # sd, ds are blocklets
for each in rotate(block[0],blocklet): # each in ['asd', 'sad', 'sda'] and ['ads', 'das', 'dsa']
permu.append(each)
return permu
def rotate(letter, word):
rotatedlist=list()
for i in range(len(word)+1):
rotatedlist.append(word[:i]+letter+word[i:])
return rotatedlist
def main():
word=raw_input('Enter the word to be anagrammed: ') #for example: 'asd'
print anagram(word)
if __name__ == '__main__':
main()
我正在教自己一般算法及其分析,如果有人能提出一个经验法则来估计涉及递归的算法的顺序,我将不胜感激。