Loop Invariant用于计算阶乘的函数

时间:2011-12-05 23:11:28

标签: function loops factorial invariants loop-invariant

我很难正确识别以下函数的循环不变量:

F(y)
    X <-- 1
    while (y > 1)
        do x <-- x * y
           y <-- y - 1
    return (x)

我已经将循环不变量标识为x = 1 OR x = y!,因为该语句作为前置条件保持为真,并且作为后置条件保持为真。

对于每次迭代似乎都不成立,例如,如果y = 3,那么在循环的第一次迭代中,x = 1 * 3,相当于3和NOT 3!等于6。

我猜这是我的困惑所在。一些书籍文章声明循环不变量是一个必须在开头或循环(因此是前置条件)等于true的语句,并且必须在循环结束时保持为真(因此在条件后)但不一定需要在循环中保持正常。

上述函数的正确循环不变量是什么?

2 个答案:

答案 0 :(得分:5)

可能的循环不变量是x⋅y! = y 0 其中 y 0 y 的初始值,传递给功能。无论循环的迭代次数已经完成,此语句始终为真。

在循环开始之前必须保持前提条件,在循环结束后必须保持后置条件,并且无论循环的迭代次数是多少都必须保持不变(这就是为什么它被称为“不变” - 它并没有改变它是真的。)

通常,同一循环可能存在不同的可能不变量。例如, 1 = 1 对于任何循环都是真的,但为了显示算法的正确性,通常需要找到更强的不变量。

答案 1 :(得分:1)

循环不变量可以从后置条件派生,有点直觉和类似代数的推理。

您知道帖子条件的一部分:x == Y!,其中Y是作为参数给出的初始值。 y是值变化的变量。这就是后期条件的其余部分,BTW:y == 1

每次传球都是如此?理由倒退。

在最后一次通过x == Y*Y-1*...*2 and y == 2

在此之前? x == Y*Y-1*...*3 and y == 3

之前呢?

最初的情况是什么时候y == Y

最后。鉴于后置条件和不变量,什么前提条件是设置动态所需的最弱的语句集?代码建议x=1 and y=Y

你知道每次通过循环时,必须改变某些东西,程序必须证明可以使状态朝着后置条件前进。真的吗?是否存在循环状态的自然值函数,可证明向零减小? (这似乎是一个棘手的问题,因为y变量似乎很容易做到这一点。在许多真实世界的循环中并不明显,所以你必须问你的循环设计问题。)