для j в анаграмме (слово [: i] + слово [i + 1:]): <- как это работает? - PullRequest
0 голосов
/ 01 апреля 2019

Я построил генератор анаграммы.Это работает, но я не знаю, что цикл для функций работает в строке 8, почему он работает только в

for j in anagram(word[:i] + word[i+1:]):

, почему не

for j in anagram(word):

Кроме того, я хочу знатьчто

for j in anagram(...)

означает и делает ...

что j делает в этом цикле for?

это мой полный код

def anagram(word):
    n = len(word) 
    anagrams = []
    if n <= 1:
        return word
    else:
        for i in range(n):
            for j in anagram(word[:i] + word[i+1:]): 
                anagrams.append(word[i:i+1] + j) 
        return anagrams

if __name__ == "__main__":
    print(anagram("abc"))

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Причина, по которой вы не можете написать for i in anagram(word), заключается в том, что она создает бесконечный цикл.

Так, например, если я напишу рекурсивную факториальную функцию,

def fact(n): 
    if n <= 1: 
        return 1
    return n * fact(n - 1)

Это работает и не является круговым определением, потому что я даю компьютеру два отдельных уравнения для вычисления факториала:

п ! = 1
п ! = n ( n -1)!

и я говорю, когда использовать каждый из них: первый, когда n равен 0 или 1, второй, когда n больше этого значения. Ключ к его работе заключается в том, что в конечном итоге мы перестаем использовать второе определение и вместо этого используем первое определение, которое называется «базовый случай». Если бы я вместо этого сказал другое истинное определение, подобное этому n ! = n ! компьютер будет следовать этим инструкциям, но мы никогда не будем переходить к базовому случаю, поэтому мы будем входить в бесконечный рекурсивный цикл. Этот цикл, вероятно, быстро исчерпал бы ресурс, называемый «стеком», что привело бы к ошибкам о «чрезмерной рекурсии» или слишком большом количестве «кадров стека» или просто «переполнении стека» (для которого этот сайт назван!). И потом, если вы дадите ему математически неверное выражение типа n ! = n n ! он будет бесконечно зацикливаться и также будет неправильно, даже если он не будет бесконечно зацикливаться.

Факториалы и анаграммы тесно связаны, фактически мы можем математически сказать, что

len(anagrams(f)) == fact(len(f))

так что решение одного означает решение другого. В этом случае мы говорим, что анаграмма word, которая пуста или имеет длину 1, просто [word], список, содержащий только это слово (Ваш алгоритм немного портит этот случай, так что это ошибка.)

Анаграмма любого другого слова должна иметь отношение к анаграммам слов длины len(word) - 1. Итак, что мы делаем, мы вытаскиваем каждый символ из слова и помещаем его в начале анаграммы. Таким образом, word[:i] + word[i+1:] - это слово, за исключением того, что пропущена буква в индексе i , а word[i:i+1] - это пробел между ними - другими словами, это буква в индексе i .

0 голосов
/ 01 апреля 2019

Это НЕ ответ, а руководство для вас, чтобы понять логику самостоятельно.

Во-первых, вы должны понять одну вещь anagram(word[:i] + word[i+1:]) не то же самое, что anagram(word)

>>> a = 'abcd'
>>> a[:2] + a[(2+1):]
'abd'

Вы можете ясно увидеть разницу.

И для более ясного понимания я бы порекомендовал вам напечатать результат каждого слова в рекурсии. поместите оператор print(word) перед началом цикла.

...