无限计算两个函数

时间:2017-05-29 14:43:06

标签: f# f#-interactive

我有以下两个功能

let rec f n =
    if n < 10 then "f" + g (n + 1) else "f"
and g n =
    if n < 10 then "g" + f (n + 1) else "g"

我需要找出f中是否有任何可以启动无限计算的参数。

我的直接答案是否定的,因为有一个10的上限,总会返回一个字母。它是否正确?

1 个答案:

答案 0 :(得分:1)

我假设第2行和第4行应该缩进,否则这不是有效的F#。

理论上

除输出外,

gf相同,我们不关心输出。所以我们不妨看看下面的函数,它具有相同的终止属性但会丢弃输出:

let rec f n = if n < 10 then f (n + 1)

f的输入类型是int,它是一个32位有符号整数。它仅允许从-2147483648到2147483647(System.Int32.MinValueSystem.Int32.MaxValue)的值。没有其他可表示的案例。

好吧,对于任何10或更高的输入,该事情终止,否则只要计数到10,然后终止。

在实践中

那就是说,问题中的函数连接字符串的方式有O(n²)时间复杂度。我认为您不想等待f System.Int32.MinValue之类的呼叫在真实计算机上终止。而且,这些不是尾递归。你肯定会打击你的筹码或时间限制。所以这是一个看待在现实中无用的理论属性的案例。

换句话说:嗯,你甚至在做什么?