簡體   English   中英

如何證明后續算法的正確性?

[英]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/

  1. 我不會使用“ *”運算符

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

應該

multiply(multiply(c,y),int(z/c))+multiply(y,(z %c))
  1. 正如Josep提到的那樣,使用'*'運算符進行計算,並使用ur乘法()進行相同的計算。 將結果與精確度進行比較。
  2. 為了節省時間。 在執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM