查找递归函数的结果

时间:2017-02-01 14:25:55

标签: haskell functional-programming

给出的问题是:“f 572f的以下定义有什么价值?”

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)

对我而言,这看起来像一个递归函数,答案应该是值从5721044mod 1044 5720时)加起来

1 个答案:

答案 0 :(得分:1)

计算数字的双(2*)是一种非常低效的方法。因为您提供了g n (n+1)

g会被赋予两个数字,只要(mod i m) == 0失败(i不能被m分割),它就会增加i < / strong>即可。从成功的那一刻起,它返回i。现在n的最低k大于k2*kf显然是-- 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; } 不是这种情况)。