检查每次调用的递归函数的值

时间:2016-12-12 13:19:51

标签: python recursion

我用递归计算1 - x + x^2 - x^3 + .....。所以它是1 - x*(1 - x*(1 - x*...,我必须在eacth递归步骤中调用1 - x*F(x)。 Python中的代码在这里:

def F(x, epsilon, k, y, iteration, value):
    if(iteration == k):
        print('run out of iterations', )
        return 1 - x 
    else:
        return 1 - x * F(x, epsilon, k, y, iteration + 1)

我想知道是否有办法知道当前通话的F即时值。在我看来ATM,我不能这样做。评论家欢迎!

4 个答案:

答案 0 :(得分:0)

你的意思是:

def F(x, epsilon, k, y, iteration, value):
    if(iteration == k):
        print('run out of iterations', )
        return 1 - x 
    else:
        a=1 - x * F(x, epsilon, k, y, iteration + 1)
        print a
        return a

答案 1 :(得分:0)

你可以在返回之前将结果放入变量,即:

def F(x, epsilon, k, y, iteration, value):
    if(iteration == k):
        print('run out of iterations', )
        res = 1 - x
    else:
        res = 1 - x * F(x, epsilon, k, y, iteration + 1)

    print(res)

    return res

答案 2 :(得分:0)

对于简单的问题或理解,我通常只运行我的调试器(我现在使用Spyder)并查看在递归的各个级别更改的各种值。如果返回值是问题(通常是这样),我确保在返回之前将该值存储到局部变量中,以便我可以直接在调试器中看到它。在您的示例代码中,这意味着将return行更改为

result = 1 - x
return result

result = 1 - x * F(x, epsilon, k, y, iteration + 1)
return result

当然,在你的情况下,你可以在函数结尾处只有一条return行,在分配结果后,无论如何都是更好的风格。这通常就足够了。在更严重的情况下,我将值打印到控制台,添加行

print(iteration, result)
result =return行之间

,打印后可能会暂停input('Press any key to continue...')。如果问题确实很严重,我会将值保存到文本文件中,但这会使观看失败,并将其存储起来进行分析。

答案 3 :(得分:0)

这似乎是decorator函数的一个很好的用例。这是一个自动应用于"装饰"功能,用自身的增强版本替换功能。

对于跟踪,您可以使用这样的东西。这将打印您的函数的所有调用以及相应的参数和结果,所有这些都很好地缩进,因此您可以看到所谓的内容。

def trace(f):
    trace.depth = 0
    def _f(*args, **kwargs):
        print("  " * trace.depth, ">", f.__name__, args, kwargs or "")
        trace.depth += 1
        res = f(*args, **kwargs)
        trace.depth -= 1
        print("  " * trace.depth, "<", res)
        return res
    return _f

这样,您不必向函数本身添加任何print语句。只需将装饰器应用于您的函数:

@trace
def F(x, epsilon, k, y, iteration, value):
    ...

这相当于F = trace(F);然后只需调用你的函数。

以下是使用简单Fibonacci函数的示例:

@trace
def fib(n):
    return 1 if n < 2 else fib(n - 1) + fib(n - 2)

>>> fib(2)
 > fib (2,) 
   > fib (1,) 
   < 1
   > fib (0,) 
   < 1
 < 2