给出的问题是:“f 572
对f
的以下定义有什么价值?”
f :: Int -> Int
f n = g n (n+1)
g :: Int -> Int -> Int
g m i
| (mod i m) == 0 = i
| otherwise = g m (i+1)
对我而言,这看起来像一个递归函数,答案应该是值从572
到1044
(mod 1044 572
将0
时)加起来
答案 0 :(得分:1)
计算数字的双(2*)
是一种非常低效的方法。因为您提供了g n (n+1)
。
g
会被赋予两个数字,只要(mod i m) == 0
失败(i
不能被m
分割),它就会增加i
< / strong>即可。从成功的那一刻起,它返回i
。现在n
的最低k
大于k
可2*k
,f
显然是-- equivalent to
f' = (2*)
。
所以0
相当于:
0
如果负数也被视为,则对于严格的负数,它将始终返回0
,因为满足模数关系的第一个数字是-- equivalent (with negative numbers and zero)
f' n | n > 0 = 2*n
| n < 0 = 0
-- n == 0 should error
。最后,如果给出i
,则会出错。因此,在考虑零和负数时,完整的定义是:
n
由于算法每次递增Integer
,程序将与content::mojom::CreateViewParamsPtr content::mojom::CreateViewParams::New() {
CreateViewParamsPtr rv;
mojo::internal::StructHelper<CreateViewParams>::Initialize(&rv);
return rv;
}
线性运行(给定增量和模数可以在恒定时间内检查),因此 O(n) 。等效定义当然在恒定时间内运行(给定乘法和比较可以在恒定时间内完成,例如int PatrickMainChrome(int argc, const char** argv) {
content::mojom::CreateViewParams::New();
return 0;
}
不是这种情况)。