确定递归函数是否收敛

时间:2013-01-21 01:59:55

标签: function parsing recursion static-analysis convergence

考虑以下递归因子函数:

fact(n) =
    if (n = 0) return 1
    return n * fact(n - 1)

上述函数收敛于包括零的所有正整数。但是它不会收敛于负整数。

接下来,请考虑以下程序:

fact(n) =
    if (n < 0) return 0
    if (n = 0) return 1
    return n * fact(n - 1)

上述函数收敛于所有整数。

我想知道你将如何静态地确定递归函数是否收敛。

2 个答案:

答案 0 :(得分:3)

在一般情况下,你不能。这个问题恰恰是halting problem

这是一个递归函数的简单示例,它可能以所有正输入结束,以尾递归方式编写(断言所有正n停止的是Collatz conjecture):

stop(n, a=0) =
  if (n == 1) return a
  if (n % 2 == 0) return stop(n / 2, a + 1)
  return stop(3 * n + 1, a + 1)

答案 1 :(得分:1)

这是一件好事,你没有指定一种语言,暗示你在考虑无界的整数,因为这意味着我可以指向this prototype analyzer for a toy language作为网络应用程序。

有了无限的整数,rici是对的,这是停滞不前的问题。但是,静态分析仪解决的大多数其他问题也等同于暂停问题。这并不妨碍所讨论的静态分析仪有用。他们通过接受假阴性,误报或两者兼而有之,解决了不可判断性问题。

如果您更喜欢使用类似C语法,您还可以使用Frama-C的值分析来确定whether a simple C program terminates。此分析器不处理递归函数,它将整数类型视为有界(它们是有界的)。有界整数类型在理论上使问题更容易(对于输入语言的某些定义,它变得可判定)但在实践中仍然很难。