1

我在下面有一个函数,它将一个值作为输入,并确定一个 new_value(new_value 将始终小于 original_value)。如果 new_value 和 original_value 之间的差异小于指定的容差,则返回 new_value。如果容差更大,则以 new_value 作为参数再次调用该函数,以计算 new_new_value。根据输入的 original_value,有时永远不会满足公差条件。如何使函数在一定次数的迭代后停止迭代?我试图在 else 之后输入 count=0,count+=0,但这不起作用,因为每次再次调用该函数时它都会返回零。谢谢

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

3 回答 3

0

您不应该为此使用递归。使用for循环迭代固定次数,使用容差测试在适当的情况下提前中断。

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
于 2020-04-22T20:15:06.963 回答
0

如果要在达到某个迭代深度后停止迭代,则需要将计数器传递给函数。这可以通过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)

您甚至可以更进一步并添加一个限制参数来指定迭代限制:

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)
于 2020-04-22T20:17:15.903 回答
0

您可以使用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)
于 2020-04-22T20:18:38.377 回答