我用递归计算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,我不能这样做。评论家欢迎!
答案 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