我剛開始閱讀算法設計手冊,發現難以掌握如何證明算法的正確性。有人可以通過解釋我提供的示例問題來幫助我。從何處開始驗證算法的正確性
證明以下遞歸算法的正確性乘兩個 自然數,對於所有整型常量c^2≥
function multiply(y,z)
comment Return the product yz.
1. if z = 0 then return(0) else
2. return(multiply(cy, z/c) + y · (z mod c))
我剛開始閱讀算法設計手冊,發現難以掌握如何證明算法的正確性。有人可以通過解釋我提供的示例問題來幫助我。從何處開始驗證算法的正確性
證明以下遞歸算法的正確性乘兩個 自然數,對於所有整型常量c^2≥
function multiply(y,z)
comment Return the product yz.
1. if z = 0 then return(0) else
2. return(multiply(cy, z/c) + y · (z mod c))
讓我們正式說明我們正在試圖證明:
For all integers y, z, we have multiply(y, z) = y · z.
對於遞歸算法,我們通常需要一個歸納證明。這要求我們選擇一個歸納量,每次遞歸調用時都應該減少。在這裏,我們可以使用|z|
。歸納主張是
For all integers k ≥ 0, for all integers y, z such that |z| = k,
we have multiply(y, z) = y · z.
基本情況是當|z| = 0
。這意味着z = 0
,我們驗證multiply(y, z) = 0
(採取if
)和y · z = y · 0 = 0
。
歸納案例是當|z| > 0
。 else
被採取,並且自c ≥ 2
,我們知道|trunc(z/c)| < |z|
,因此,由歸納假設,multiply(c · y, trunc(z/c)) = c · y · floor(z/c)
。返回值是
c · y · trunc(z/c) + y · (z mod c)
= y · (c · trunc(z/c) + c · (z/c - trunc(z/c)))
= y · (c · z/c)
= y · z,
根據需要。
通過z上的遞歸。
我們假設這是真的,每Ž<ķ然後,它是K.
它爲真,如果z = 0的情況:乘法(Y,Z)= 0(規則1)。
然後,它會是真實的每K.
案例1位:Z <Ç
則z/C = 0,Z%C = Z
然後乘以( y,z)=乘(cy,z/c)+ y·(z mod c))(規則2)。
=乘(cy,0)+ y·z = 0 + y。 z = y。 žTRUE
案例2位:Z> = C
那麼z/C < Z(因爲C> = 2)
然後乘以(Y,Z)=乘法(CY,Z/c)+ y·(z mod c))(規則2)。
= cy。 (z/c)+ y。 (z mod c)(RECURSION)
= y。 (c。(z/c)+ z mod c)
但是c。(z/c)+ z mod c = z(mod的定義)
然後乘(y,z)= y。 z完成了。
c *(z/c)+ z mod c = z?讓c = 3和z = 7,你會得到8≠z。 – bmay2
@ bmay2 - 7/3 = 2 => 3 *(7/3)= 6,7模3 = 1,=> 6 + 1 = 7 –
其中一個我看着文字牆的時刻,我感覺像一隻猿 – SuburbanFilth
你是如何得到'c /(z/c - trunc(z/c)))'部分的? – 0x499602D2
@ 0x499602D2它等於'z mod c' - 我們劃分,從其自身中減去商的整數部分,然後乘以'c'獲得餘數。 –