Остановить итеративную функцию python, которая продолжает повторяться - PullRequest
1 голос
/ 22 апреля 2020

У меня есть функция ниже, которая принимает значение в качестве входа и определяет new_value (new_value всегда будет меньше, чем original_value). Если разница между new_value и original_value меньше указанного допуска, возвращается new_value. Если допуск больше, функция вызывается снова с аргументом new_value, чтобы вычислить значение new_new_value. В зависимости от введенного исходного_значения, иногда условие допуска никогда не выполняется. Как сделать так, чтобы функция перестала выполнять итерации после определенного количества итераций? Я попытался положить в count = 0, count + = 0 после else, но это не работает, так как он возвращается к нулю каждый раз, когда функция вызывается снова. Спасибо

def calc_value(original_value):
   # equations to calculate new_value
   if original_value - new_value < tolerance:
      return new_value
   else calc_value(new_value)

Ответы [ 3 ]

0 голосов
/ 22 апреля 2020

Если вы хотите прекратить итерации после достижения определенной глубины итерации, вам нужно будет передать счетчик в функцию. Это можно сделать с помощью аргумента default в функции:

def calc_value(original_value, count = 0):
   # equations to calculate new_value
   if original_value - new_value < tolerance:
      return new_value
   else:
      if count > 100:
          return new_value  # Handle reaching limit
      calc_value(new_value, count + 1)

Каждый раз, когда вы вызываете функцию рекурсивно, добавьте 1 к счетчику и проверьте, достигнут ли предел.

Используя аргумент default, вам не нужно задавать его при вызове функции:

calc_value(42)

Вы можете даже пойти дальше и добавить аргумент limit, чтобы указать предел итерации:

def calc_value(original_value, count = 0, limit = 100):
    # ...
    if count > limit:
        return new_value
    calc_value(new_value, count, limit)

Затем вы можете определить аргументы либо по порядку, либо указав аргумент:

# Default values: count = 0, limit = 100
calc_value(42)

# Will set count to default 0, and limit to 150
calc_value(42, limit=150)

# Will set count to 5, and limit to 200
calc_value(42, 5, 200)

# Will set count to 5, and limit to 150
calc_value(42, limit=150, count=5)
0 голосов
/ 22 апреля 2020

Вы можете использовать function attributes. Как то так.

def fun(x):
    if fun.counter<=max_value:
        fun.counter+=1
    else:
        return
    print x
    if x:
        fun(x-1)
fun.counter = 0
max_value = 3
fun(5)
0 голосов
/ 22 апреля 2020

Вы не должны использовать рекурсию для этого. Используйте for l oop, чтобы выполнить итерацию фиксированное количество раз, используя тест на допуск, чтобы досрочно прервать работу.

def calc_value(original_value):
    old_value = original_value
    for _ in range(10):
        new_value = ...
        if abs(old_value - new_value) < tolerance:
            break
        old_value = new_value
    return new_value
...