这个问题刚刚浮现在我的脑海中:
函数 G(m( 定义如下:
a( 如果 m <= 100,则 G(m( = G(G(m + 11((
b( 如果 m> 100,则 G(m( = m – 10
根据上面的问题,如何设计一个计算G(m(的恒定时间算法?
(b( 部分显然可以在常量时间内计算,假设m
适合整数变量。
问题要求证明的棘手部分是(a(部分是恒定的。然后O(1)
时间接踵而至。这可以通过数学归纳或其他方式来完成。
归纳证明如下。
首先观察G(101)
根据定义等于 101 - 10 = 91。
对于90 <= n <= 100
它持有G(n) = G(G(n + 11))
,其中n + 11 > 100
。因此G(n)
等于G(n + 11 - 10) = G(n+1)
,即 91。
由此,十个方程G(91 - 1) = 91
、G(91 - (1 - 1)) = 91
、...、G(91 - (1 - 10)) = 91
都是真的。这是一般归纳的基础。
归纳步骤:假设G(91 - i) = 91
、G(91 - (i - 1)) = 91
、...、G(91 - (i - 10)) = 91
对于从 1 到某个界限的所有i
数都为真。
然后G(91 - (i + 1)) = G(G(91 - i - 1 + 11)) = G(G(91 - (i - 10)))
.从基本步骤中,我们知道G(91 - (i - 10)) = 91
.将其代入上面的等式中,我们得到G(91)
,也已知为 91。由此可见,这个假设也适用于i+1
。
因此,对于所有n >= 1
,G(91 - n)
等于 91。感应是经过验证的。
在Python 中计算G
的常时算法示例:
def G(m):
if m > 100:
return m - 10
else:
return 91