有没有办法只在非递归函数中做某事?

时间:2019-05-09 10:20:18

标签: python function recursion

如果我有类似的功能:

def function(some number, steps):
  if steps == 1: return 1
  result = some calculation + function(some number, steps - 1)
  return round(result, 2)

返回一些浮点数。
我的问题是:只有当我从整个函数返回结果而不是从递归调用返回结果时,才有办法返回舍入结果(以节省计算精度)。
希望你能理解我的问题。
预先感谢。

4 个答案:

答案 0 :(得分:2)

通常来说,如果您想检测到自己在Python的递归调用中,则可以向函数添加默认参数,如下所示:

def my_func(arg1, arg2, _inside_recursion=False):
   # Default calls will have _inside_recursion as False
   # Make sure that your recursive calls set the parameter
   recursive_result = my_func(arg1, arg2, _inside_recursion=True)

答案 1 :(得分:2)

您无法区分是在递归过程中还是在第一步中调用当前函数。但是,您可以引入一个新函数,该函数将调用现有函数并进行其他四舍五入。

def internal_function(some number, steps):
    if steps == 1: return 1
    return some calculation + function(some number, steps - 1)

def function(some_number, steps):
    return round(internal_function(some_number, steps), 2)

编辑:确实,向函数添加可选参数的方法也可以使用,但它有两个缺点:

  • 污染了该函数的公共接口-您的用户现在想知道他们是否应该给该参数一个值,以及他们应该给哪个值
  • 使计算部分的阅读时间更长,并且还可能破坏tail-call optimizations

答案 2 :(得分:2)

是的!您可以提供一个将被连续调用触发的标志:

def function(some number, steps, do_rounding=True):
    if steps == 1:
        return 1
    result = some calculation + function(some number, steps - 1, False)
    if do_rounding:
        return round(result, 2)
    else:
        return result

答案 3 :(得分:0)

也许您想要这样的东西?这不等同于OP代码,但很有意义。它将some_calculation递归steps次,并舍入最终值。

def function(x, steps):
  if steps == 1: return round(x, 2)
  return function(some_calculation(x), steps - 1)
相关问题