[英]How to prove correctness of following 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;
}
謝謝
1)對於z=0
您的函數顯然是正確的
2)假設multiply(x, y)
對於0 <= y < y0
返回x*y
。 然后
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
由於這是一項家庭作業,因此我僅給出提示。
首先,函數中有一個if
。 在z = 0的情況下,證明正確性是微不足道的。
接下來,如果z> 0,則需要檢查兩件事:
首先,不變量:您必須檢查一下,假設乘法在遞歸調用中正確工作,返回的值確實是兩個數字的乘積。
第二:您必須證明該函數最終會返回,即無論您給出哪個數字,最終都將到達該函數不再遞歸調用自身的地步。 提示:查看參數的二進制表示形式,以及對其進行二乘和二除的運算。
那時,確定算法的復雜度也應該很容易。
提取公式進行迭代。 然后證明它為n = 1,n = 2,..之后證明步驟n => n + 1 ..如果您不知道該怎么做,請訪問https://math.stackexchange.com/
我不會使用“ *”運算符
乘(c * y,int(z / c))+ y *(z%c)
應該
multiply(multiply(c,y),int(z/c))+multiply(y,(z %c))
為了節省時間。 在執行main方法中的time方法之前。 通話時間庫
time_t startTime =時間(NULL); cout <<乘(y,z)<< endl; time_t endTime =時間(NULL); cout <<(endTime-startTime)<<“ sec”;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.