fib(n)
计算第n个斐波纳契数:
def fib(n):
"""Compute nth Fibonacci number"""
pred, curr = 1, 0 # 0 is 0th Fibonacci number
k = 0 # curr is kth Fibonacci number
while k < n:
pred, curr = curr, pred + curr
k = k + 1
return curr
它不会对程序的其余部分产生副作用。它是线程安全的
尽管状态(k
,curr
,pred
)在本地修改,但fib(n)
是pure function吗?
答案 0 :(得分:2)
这是否是一个纯函数的问题在很大程度上取决于定义,因此基于意见。但是,幸运的是,我们为您提供了维基百科的定义。
- 在给定相同参数值的情况下,函数始终评估相同的结果值。功能结果值不能依赖于任何 程序执行时可能发生变化的隐藏信息或状态 继续或在程序的不同执行之间,也不可能 取决于I / O设备的任何外部输入(通常见下文)。
- 对结果的评估不会导致任何语义上可观察到的副作用或输出,例如可变对象的突变 或输出到I / O设备(通常见下文)。
醇>
给定相同的输入,您的fibn
将始终产生相同的输出。这很清楚。并且,正如您所说,修改的变量仅存在于函数的局部范围内,因此函数外部没有语义可观察的副作用。唯一剩下要显示的((1)的推论)是你的函数总是终止。有一个while
循环,但证明您的while
循环将在任何有限n
的情况下终止,这是微不足道的。因此,根据提供的定义,您的函数是纯。
现在,我假设您列出“必须是整数”作为前提条件。如果你没有将它列为一个要求,那么我可以生成一个类,其排序方法总是使它大于任何k
值,从而强制一个无限循环。无限循环具有非常明显的副作用:在这种情况下,您的程序往往不会终止。但是,如果您将注意力限制在整数输入上,则您的函数是纯粹的。
答案 1 :(得分:0)
在讨论外部世界时,纯粹的功能发挥作用。如果在调用函数之前拍摄所有对象的快照,之后,两个快照应该完全相同。
您放置的函数是纯函数,因为它不会修改程序的状态或任何其他部分。在以下某种情况下,您的功能不会是纯粹的:
global
关键字修改其他变量n