Причина, по которой вы не можете написать 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 .