如何证明以下算法的正确性?

时间:2011-11-09 11:10:15

标签: c++ algorithm

我需要证明以下算法正常工作,我知道归纳,但不知道如何在这里使用它?如果我知道算法的复杂性,它是多么最优,我会很高兴吗? 什么是运行时间?请帮帮我

#include <cstdlib>
#include <iostream>
#define c 2
//we should take c   more ot equal  then 2
using namespace std;
int multiply(int y,int z){
      // product yz
    if(z==0) return 0;
    return (multiply(c*y,int(z/c))+y*(z %c));
}

int main(int argc, char *argv[])
{
    int y=5;
    int z=7;
    cout<<multiply(y,z)<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

感谢

4 个答案:

答案 0 :(得分:5)

1)对于z=0,你的功能显然是正确的

2)假设multiply(x, y)x*y返回0 <= y < y0。然后

  x*y
= x*((y/c)*c + y%c)    # by the definition of %
= x*c*(y/c) + x*(y%c)  # distributive, commutative laws
= multiply(x*c, y/c) + x*(y%c) # 0 <= y/c < y, induction hypothesis

答案 1 :(得分:4)

由于这是一个家庭作业,我只会给出提示。

首先,函数中有if。 在z = 0的情况下,证明正确性是微不足道的。

接下来,如果z> 0,那么有两件事要检查:

首先,不变量:你必须检查一下,假设乘法与递归调用一起正常工作,返回的值确实是两个数字的乘积。

第二:你必须证明这个函数最终会返回,即无论你给出哪个数字,最终你都会达到函数不再递归调用自身的程度。给出一个提示:查看参数的二进制表示,以及乘以2和除以2的乘法。

此时,还应该很容易确定算法的复杂性。

答案 2 :(得分:1)

提取迭代的公式。然后证明它为n = 1,n = 2,......之后证明步骤n =&gt; n + 1 ..如果您不知道该怎么做,请在https://math.stackexchange.com/

询问

答案 3 :(得分:0)

  1. 我不会使用&#39; *&#39;操作

    乘(c * y,int(z / c))+ y *(z%c)

  2. 应该是

    multiply(multiply(c,y),int(z/c))+multiply(y,(z %c))
    
    1. 正如Josep所提到的,使用&#39; *&#39;进行计算。运算符并使用ur multiply()执行相同操作。将结果与精确度进行比较。
    2. 获得时间。在main方法中执行time方法之前。致电time library

      time_t startTime = time(NULL); COUT&LT;&LT;乘法(Y,Z)和LT;&LT; ENDL; time_t endTime = time(NULL); COUT&LT;≤(结束时间 - 开始时间)LT;&LT;&#34;秒&#34 ;;