我有以下两个功能
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的上限,总会返回一个字母。它是否正确?
答案 0 :(得分:1)
我假设第2行和第4行应该缩进,否则这不是有效的F#。
g
和f
相同,我们不关心输出。所以我们不妨看看下面的函数,它具有相同的终止属性但会丢弃输出:
let rec f n = if n < 10 then f (n + 1)
f
的输入类型是int
,它是一个32位有符号整数。它仅允许从-2147483648到2147483647(System.Int32.MinValue
和System.Int32.MaxValue
)的值。没有其他可表示的案例。
好吧,对于任何10或更高的输入,该事情终止,否则只要计数到10,然后终止。
那就是说,问题中的函数连接字符串的方式有O(n²)时间复杂度。我认为您不想等待f System.Int32.MinValue
之类的呼叫在真实计算机上终止。而且,这些不是尾递归。你肯定会打击你的筹码或时间限制。所以这是一个看待在现实中无用的理论属性的案例。
换句话说:嗯,你甚至在做什么?