Python: использование рекурсивного алгоритма как генератор

Вы можете получить доступ за пределами cpanel, используя Awstats , для настройки Awstats в Ubuntu вы можете увидеть http://ubuntu-tutorials.com/2008/01/16/configuring-awstats-on -ubuntu-сервер /

99
задан 30.10.2008, 02:29

3 ответа

def getPermutations(string, prefix=""):
    if len(string) == 1:
        yield prefix + string
    else:
        for i in xrange(len(string)):
            for perm in getPermutations(string[:i] + string[i+1:], prefix+string[i]):
                yield perm

Или без аккумулятора:

def getPermutations(string):
    if len(string) == 1:
        yield string
    else:
        for i in xrange(len(string)):
            for perm in getPermutations(string[:i] + string[i+1:]):
                yield string[i] + perm
117
ответ дан 05.11.2019, 14:07

Это избегает len(string) - глубокая рекурсия и является в целом хорошим способом обработать генераторы в генераторах:

from types import GeneratorType

def flatten(*stack):
    stack = list(stack)
    while stack:
        try: x = stack[0].next()
        except StopIteration:
            stack.pop(0)
            continue
        if isinstance(x, GeneratorType): stack.insert(0, x)
        else: yield x

def _getPermutations(string, prefix=""):
    if len(string) == 1: yield prefix + string
    else: yield (_getPermutations(string[:i]+string[i+1:], prefix+string[i])
            for i in range(len(string)))

def getPermutations(string): return flatten(_getPermutations(string))

for permutation in getPermutations("abcd"): print permutation

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

<час>

Python 3.3 добавит yield from к синтаксису, который допускает естественную делегацию подгенератора:

def getPermutations(string, prefix=""):
    if len(string) == 1:
        yield prefix + string
    else:
        for i in range(len(string)):
            yield from getPermutations(string[:i]+string[i+1:], prefix+string[i])
28
ответ дан 05.11.2019, 14:07

Внутренний вызов к getPermutations - это - генератор, также.

def getPermutations(string, prefix=""):
   if len(string) == 1:
      yield prefix + string            
   else:
      for i in range(len(string)):
         getPermutations(string[:i]+string[i+1:], prefix+string[i])  # <-----

необходимо выполнить итерации через это с для цикла (см., что @MizardX отправляет, который вычеркнул меня к секундам!)

19
ответ дан 05.11.2019, 14:07

Теги

Похожие вопросы