2013-09-26 3 views
0

Эта функция имеет функцию внутри функции. Эта программа создает список со всеми возможными комбинациями строки. У меня проблемы с внутренней функцией, она рекурсивна. Может кто-нибудь, пожалуйста, помогите мне?Может кто-нибудь помочь мне понять следующую программу python?

def combine0(s): 
    out = [] 
    length = len(s) 
    def loc(start): 
     for i in range(start, length): 
      out.append(s[i]) 
      print (''.join(out)) 
      if (i < length-1): 
       loc(i+1) 
      del out[-1] 
    loc(0) 

combine0('mary') 

производит

m 
ma 
mar 
mary 
may 
mr 
mry 
my 
a 
ar 
ary 
ay 
r 
ry 
y 
+0

не работает –

+1

Является ли 'def loc (start):' indent неправильно? – gregb212

+0

обновлен отступ –

ответ

0

При вызове с аргумент 'Mary', это то, что combine0.:

s = 'Mary' 
out = [] 
length = len(s) # in this case length=4 

# for i in range(0, 4): 
# i = 0 
out.append(s[0]) # s[0] = 'M', out = ['M'] 
print(''.join(out)) # print('M') 
# if i < length - 1: => if 0 < 3: 
# loc(i + 1) => loc(1) 
# for j in range(1, 4): 
# j = 1 
out.append(s[1]) # s[1] = 'a', out = ['M', 'a'] 
print(''.join(out)) # print('Ma') 
# if j < length - 1: => if 1 < 3: 
# loc(j + 1) => loc(2) 
# for k in range(2, 4): 
# k = 2 
out.append(s[2]) # s[2] = 'r', out = ['M', 'a', 'r'] 
print(''.join(out)) # print ('Mar') 
# if k < length - 1: => if 2 < 3: 
# loc(k + 1) => loc(3) 
# for l in range(3, 4): 
# l = 3 
out.append(s[3]) # s[3] = 'y', out = ['M', 'a', 'r', 'y'] 
print(''.join(out)) # print('Mary') 
# if l < length - 1: => if 3 < 3: 
# condition fails -> do not recurse 
del out[-1] # out = ['M', 'a', 'r'] 
# end of for l in range(3, 4) 
del out[-1] # out = ['M', 'a'] 
# k = 3, now in for k in range(2, 4): 
out.append(s[3]) # s[3] = 'y', out = ['M', 'a', 'y'] 
print(''.join(out)) # print('May') 
# if k < length - 1: => if 3 < 3: 
# condition fails -> do not recurse 
del out[-1] # out = ['M', 'a'] 
# end of for k in range(2, 4) 
del out[-1] # out = ['M'] 
# j = 2, now in for j in range (1, 4): 
out.append(s[2]) # s[2] = 'r', out = ['M', 'r'] 
print(''.join(out)) # print('Mr') 
# if j < length - 1: => if 2 < 3: 
# loc(j + 1) => loc(3) 
# for m in range(3, 4) 
# m = 3 
out.append(s[3]) # s[3] = 'y', out = ['M', 'r', 'y'] 
print(''.join(out)) # print('Mry') 
# if m < length - 1: => if 3 < 3: 
# condition fails -> do not recurse 
del out[-1] # out = ['M', 'r'] 
# end of for m in range(3, 4) 
del out[-1] # out = ['M'] 
# j = 3, now in for j in range (1, 4): 
out.append(s[3]) # s[3] = 'y', out = ['M', 'y'] 
print(''.join(out)) # print('My') 
# if j < length - 1: => if 3 < 3: 
# condition fails -> do not recurse 
del out[-1] # out = ['M'] 
# end of for j in range(1, 4) 
del out[-1] # out = [] 
# i = 1 

#... you get the rest 
1

Да, это функция, называющая себя, имя рекурсивный вызов. Here are some descriptions такого типа кода.

Исправленный код будет:

def combine0(s): 
    out = [] 
    length = len(s) 
    def loc(start): 
     for i in range(start, length): 
      out.append(s[i]) 
      print (''.join(out)) 
      if (i < length-1): 
       loc(i+1) 
      del out[-1] 
    loc(0) 

combine0("abc") 

И выход для "ABC":

абы а аса б Ьс с

Смежные вопросы