有趣的递归功能

时间:2017-09-19 19:18:06

标签: algorithm recursion complexity-theory

前几天我正在玩一些递归函数,我做了一个简单的算法:

int f(int n) {
    if (n == 0) return 1;
    return f(f(n-1)-1) * n;
}

有趣的是它适用于f(0),f(1),f(2),f(3)和& f(4)但无论我尝试使用哪种语言或编译器,似乎没有任何东西能够在不导致堆栈溢出的情况下完成f(5)。

我的问题是如何/在哪里运行它来找到f(5)的解决方案,以及可能是这样的函数的大O复杂度?

前几对结果是1,1,2,3,8 ......

1 个答案:

答案 0 :(得分:4)

此函数的问题在于它不保证递归将停止。如果传递给f的递归调用的参数小于 n (和> = 0),则可以,但是对于n> = 4,这不再是案子。 f(4) = 8,因此在计算f(5)时,您使用参数ff(4)-1进行递归调用,即7。那么您在哪里 n = 5,现在用 n = 7来调用它,这不会减少问题,但会使问题变大。这只是进一步爆炸:要确定f(7),您需要f(6),而f(6)则需要f(5),但这是我们正在寻找的值,所以这就像永远在圈子里奔跑。

因此,f(5)未定义。递归表单不能简化为 solve f,因此f未正确定义。