Рекурсия с циклами for ничего не возвращает - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть эта функция рекурсии, которую я написал (упрощенно, она намного длиннее, но идея остается прежней)

def rec(point,length):
   if 1<length<=8:
        str_adj = '23456'
        for adj in str_adj:
            return rec(adj, length-1)
   elif length == 1:
       return 1
   else:
       return 0
rec('1',2)

[Отказ от ответственности: я знаю, что код выглядит странно, и некоторые части не нужны, потому что я упростила функцию ]
Теперь, когда я запускаю этот код, я получаю: 1 , однако вывод должен быть 5 , поскольку я перебираю каждую букву строки '23456' (которая имеет 5 букв), и для каждой буквы я называю ее длиной 1 (поскольку я уменьшаю ее 2-1 = 1), и каждый раз, когда мы получаем длину = 1, мы возвращаем 1, поэтому она должна возвращать 1 пять раз ..
I Я сел для отладки и разбивки кода на несколько частей и перепробовал много разных его версий, таких как удаление return в l oop, но при этом вывод None ...
Может кто-нибудь, пожалуйста, помогите мне определить ошибку? Спасибо! В коде python я пытаюсь сделать следующее:

rec('2',1)+rec('3',1)+rec('4',1)+rec('5',1)+rec('6',1) = 1 + 1 + 1 + 1 +1 = 5

, так как каждый раз, когда мы вызываем re c (?, 1) = 1

Скажем, str_adj = '123456789' и length = 2, тогда я хочу вывести: re c ('1', 1) + re c ('2', 1) + et c .. до + re c ('9', 1)
каждый раз, когда мы вызываем re c (?, 1) = 1, поэтому он должен возвращать 9

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Ваше ожидаемое поведение не соответствует происходящему. Вы никогда не изменяете str_adj и не устанавливаете str_adj каждый раз равным 23456. В вашем for l oop, adj всегда будет 2, если вы не измените его. Для этого он также не должен быть локальной переменной функции.

Вам также понадобится что-то, чтобы отслеживать ваши итерации.

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

def rec(point,length, str_adj, iterations):
  print("rec(", point, ", ", length, ", ", str_adj, ", ", iterations, ")")
  if 1<length<=8:
      for adj in str_adj:
        str_adj = str_adj[1:]
        iterations = iterations + 1
        return rec(adj, length-1, str_adj, iterations)
  elif length == 1:
      return iterations
  else:
      return 0

iterations = 1;
str_adj = '23456'
print(rec('1',4, str_adj, iterations))
1 голос
/ 13 апреля 2020

Я не уверен, какова конечная цель, но ваша логика c нарушает код. Когда вы вызываете re c в первый раз, он вводит первый оператор if и оттуда вызывает

rec('2', 1)

Этот вызов функции входит в оператор elif, возвращает 1, а затем концы.

Если бы вы могли уточнить, что вы пытаетесь выполнить sh Я могу попытаться исправить эту логику c.

...