2012-03-21 4 views
0

У меня проблемы с программой, программа принимает одно слово и меняет одну букву за раз, преобразует это слово в целевое слово. Хотя, имейте в виду, что преобразованное слово должно быть юридическим словом в соответствии со словарем слов, которые мне дали.Рекурсия со списками

У меня возникли проблемы с выяснением того, как сделать это рекурсивным. Программа имеет ограничение на количество шагов, которые она должна выполнить.

EDIT: Я не могу сделать список держателей Global.

Мой код до сих пор:

def changeling(word,target,steps): 
    holderlist=[] 
    i=0 
    if steps<0 and word!=target: 
     return None 

    if steps!=-1: 
     for items in wordList: 
      if len(items)==len(word): 
       i=0 

       if items!=word: 
        for length in items: 

         if i==1: 
          if items[1]==target[1] and items[0]==word[0] and items[2:]==word[2:]: 
           if items==target: 
            print "Target Achieved" 
            holder.list.append(target) 
           holderlist.append(items) 
           changeling(items,target,steps-1) 

         elif i>0 and i<len(word)-1 and i!=1: 
          if items[i]==target[i] and items[0:i]==word[0:i] and items[i+1:]==word[i+1:]: 
           if items==target: 
            print "Target Achieved" 
           holderlist.append(items) 
           changeling(items,target,steps-1) 

         elif i==0: 
          if items[0]==target[0] and items[1:]==word[1:]: 
           if items==target: 
            print "Target Achieved" 
           holderlist.append(items) 
           changeling(items,target,steps-1) 

         elif i==len(word)-1: 
          if items[len(word)-1]==target[len(word)-1] and items[0:len(word)-1]==word[0:len(word)-1]: 
           if items==target: 
            print "Target Achieved" 
           holderlist.append(items) 
           changeling(items,target,steps-1) 
         else: 
          changeling(None,None,steps-1) 

         i+=1 

    return holderlist 

Моя самая большая проблема в том, что мой список холдинг holderlist обновляется каждый раз, когда я пытаюсь сделать программу рекурсивной.

Я могу решить эту проблему, если вводить данные вручную. Вот что я хочу, чтобы программа, чтобы сделать:

changeling("find","lose",4) 
gives me: 
['fine','fond'] 
the program should then do: 
changeling('fine','lose',3) 
gives me: 
['line'] 
changeling('line','lose',2) 
gives me: 
['lone'] 
changeling('lone','lose',1) 
gives me: 
['lose'] 
Target Achieved 
+5

Это поздно здесь, и я не буду читать эту программу сейчас. Но тот факт, что вы вложили его в девять уровней, является сильным индикатором того, что есть что-то принципиально неправильное. –

+0

Ну, спасибо за вход. – Unknown

+1

Как идея: вместо выполнения 'if steps! = -1: ', выполните 'if steps == -1: return holderlist', а затем поместите ранее отложенный блок после этого (один отступ сохраняется) , Аналогично, вместо 'if items! = Word: ', do 'if items == word: break'; используя эту стратегию, вы можете легко сократить до трех/четырех уровней вложенности, что позволит вам фактически визуализировать логический поток программы. Кроме того, это не 'owner.list.append (target)' опечатка? –

ответ

1

может быть что-то вроде

def distx(w1,w2): 
    if len(w1) != len(w2):return 100000 
    score=0 
    for i in range(len(w1)): 
     score += int(w1[i] != w2[i]) 
    return score 


word_list = ["fine","fond","line","lose","lone"] 

def changeling(guess,target,steps): 
    my_steps = [] 
    print "Guess:",guess 
    if target == guess:return [guess] 
    try:word_list.remove(guess) 
    except:pass 
    my_steps.append(guess) 
    if target != guess and steps >= 0: 
     this_step = [] 
     one_step_away = [w for w in word_list if distx(guess,w) == 1] 
     for k in one_step_away: 
      print "  %s->"%guess,k 
      this_step.append(changeling(k,target,steps-1)) 
    my_steps.append(this_step) 
    return my_steps 
tmp = changeling("find","lose",4) 
print tmp