如何解决我如何证明以下算法?
Exp(n)
If n = 0
Return 1
End If
If n%2==0
temp = Exp(n/2)
Return temp × temp
Else //n is odd
temp = Exp((n−1)/2)
Return temp × temp × 2
End if
我如何通过n的强归纳证明,对于所有n≥1,乘以 Exp(n)≤2 log2 n。
ps:Exp(n)= 2 ^ n
解决方法
一种简单的方法是使用strong induction。
-
首先,证明
Exp(0)
终止并返回2^0
。 -
让N为任意甚至非负的数字。
-
假定函数
Exp
正确计算并为[0,N]中的每个2^n
返回n
。 -
在此假设下,证明
Exp(N+1)
和Exp(N+2)
都终止并正确返回2^(N+1)
和2^(N+2)
。
您完成了!通过归纳法得出,对于任何个非负N
,Exp(N)
正确返回2^N
。
PS:请注意,在本文中,2^N
的意思是“ N的幂的二”而不是“ 2和N的二进制表示的按位异或”。
该程序将完全执行以下重复操作:
P[0] = 1
n even -> P[n] -> P[n/2]²
n odd -> P[n] -> P[(n-1)/2]².2
- 程序总是终止,因为对于
n>0
,n/2
和(n-1)/2 < n
,递归调用的参数总是减少。
-
P[n] = 2^n
是重复发生的解决方案。确实,
-
n = 0 -> 2^0 = 1
-
n = 2m -> 2^n = (2^m)²
-
n = 2m+1 -> 2^n = 2.(2^n)²
这涵盖了所有情况。
随着每次调用将n
的有效位数减少1并执行一两次乘法,总数不超过有效位数的两倍。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。