显示递归函数正确性的一般证明策略?

时间:2012-03-02 18:33:26

标签: algorithm math recurrence proof

我想知道是否存在任何继续证明算法正确性的规则/方案?例如,我们在自然数上定义了一个函数$ F $,定义如下:

function F(n,k)
begin
  if k=0 then return 1
  else if (n mod 2 = 0) and (k mod 2 = 1) then return 0
  else return F(n div 2, k div 2);
end;

其中$ n \ \ text {div} \ 2 = \ left \ lfloor \ frac {n} {2} \ right \ rfloor $

任务是证明$ F(n,k)= \ begin {cases} 1 \ Leftrightarrow {n \ choose k} \ \ text {mod} \ 2 = 1 \ 0 \ text {otherwise} \ end {cases} $

它看起来并不复杂(我错了吗?),但我不知道这种证据应该如何构建。我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:6)

mathematical induction经常证明递归算法的正确性。这个方法由两部分组成:首先,你建立基础,然后你使用归纳步骤。

在你的情况下,基数是k = 0时的所有情况,或者当k是奇数但n是偶数时。

归纳步骤要求证明当f(n,k)正确时,f(2*n,2*k)f(2*n+1,2*k)f(2*n,2*k+1)f(2*n+1,2*k+1)都是正确的。

答案 1 :(得分:6)

除了以数学方式证明你的逻辑(例如:inductive proof)之外,计算科学还有一些与此相关的结果。

您可以从这里开始概述主题:Correctness
对于您的特定情况,您会对部分正确性感兴趣,以表明答案是预期的答案。然后总的正确性表明程序终止。

Hoare logic可以解决您的部分正确性。

关于这个特殊问题的终止:

如果(n%2 == 0且k%1 == 1)或(k == 0)程序终止,否则它将递归到n / 2,k / 2情况。
在k上使用strong induction,我们可以证明程序总是到达其中一个终端节点,其中k == 0。 (它可能在第一个条款的早期终止,但我们只需要显示它终止,这样做)

所以我给你留下了部分正确性的证明(因为我不知道那些东西)

答案 2 :(得分:2)

一般来说,您会尝试通过归纳证明正确性。这在证明递归函数的正确性时非常有效,因为您可以直接证明基本情况,然后可以使用该函数适用于“较小”输入的事实,以证明它适用于下一个最大输入。

在这种情况下,我会尝试通过有根据的归纳证明。具体来说,我会证明

  1. 该函数对于表单(n,0)的所有输入都是正确的。
  2. 假设对于所有输入(n',k'),使得(n',k')按字典顺序小于(n,k),函数是正确的,证明它对于(n,k)是正确的
  3. 此证明的细节需要利用函数的细节和二项式系数的bahvaior,但一般模板如上所述。

    希望这有帮助!