我需要证明以下算法正常工作,我知道归纳,但不知道如何在这里使用它?如果我知道算法的复杂性,它是多么最优,我会很高兴吗? 什么是运行时间?请帮帮我
#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;
}
感谢
答案 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)
我不会使用&#39; *&#39;操作
乘(c * y,int(z / c))+ y *(z%c)
应该是
multiply(multiply(c,y),int(z/c))+multiply(y,(z %c))
获得时间。在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 ;;