首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有趣递归函数

有趣递归函数
EN

Stack Overflow用户
提问于 2017-09-19 19:18:05
回答 1查看 465关注 0票数 3

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

代码语言:javascript
复制
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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-19 19:32:56

这个函数的问题是它不能保证递归停止。如果传递给f递归调用的参数小于n(和>= 0),则可以,但对于n >= 4,情况不再是这样。f(4) = 8,所以在计算f(5)时,您用参数f(4)-1递归调用f,它是7。所以,在n= 5的地方,现在用n= 7调用它,这不是减少问题,而是使问题更大。这只是进一步的爆炸:为了确定f(7),您需要f(6),对于f(6),您需要f(5),但这就是我们要寻找的值,所以这就像永远在循环中运行一样。

因此,f(5)是未定义的。不能将递归形式简化为解决f,因此不能正确定义f

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46308223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档