fib(n)是纯粹的功能吗?

时间:2018-03-26 00:35:35

标签: python multithreading immutability purely-functional

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

它不会对程序的其余部分产生副作用。它是线程安全的

尽管状态(kcurrpred)在本地修改,但fib(n)pure function吗?

2 个答案:

答案 0 :(得分:2)

这是否是一个纯函数的问题在很大程度上取决于定义,因此基于意见。但是,幸运的是,我们为您提供了维基百科的定义。

  
      
  1. 在给定相同参数值的情况下,函数始终评估相同的结果值。功能结果值不能依赖于任何   程序执行时可能发生变化的隐藏信息或状态   继续或在程序的不同执行之间,也不可能   取决于I / O设备的任何外部输入(通常见下文)。
  2.   
  3. 对结果的评估不会导致任何语义上可观察到的副作用或输出,例如可变对象的突变   或输出到I / O设备(通常见下文)。
  4.   

给定相同的输入,您的fibn将始终产生相同的输出。这很清楚。并且,正如您所说,修改的变量仅存在于函数的局部范围内,因此函数外部没有语义可观察的副作用。唯一剩下要显示的((1)的推论)是你的函数总是终止。有一个while循环,但证明您的while循环将在任何有限n的情况下终止,这是微不足道的。因此,根据提供的定义,您的函数是

现在,我假设您列出“必须是整数”作为前提条件。如果你没有将它列为一个要求,那么我可以生成一个类,其排序方法总是使它大于任何k值,从而强制一个无限循环。无限循环具有非常明显的副作用:在这种情况下,您的程序往往不会终止。但是,如果您将注意力限制在整数输入上,则您的函数是纯粹的。

答案 1 :(得分:0)

在讨论外部世界时,纯粹的功能发挥作用。如果在调用函数之前拍摄所有对象的快照,之后,两个快照应该完全相同。

您放置的函数是纯函数,因为它不会修改程序的状态或任何其他部分。在以下某种情况下,您的功能不会是纯粹的:

  • 如果您使用global关键字修改其他变量
  • 如果它是对象的方法并且它改变了对象内部状态
  • 如果它以任何方式突变n