javascript - 迭代与递归的大 O 区别是什么?
问题描述
迭代与递归的大 O 区别是什么?为什么运行时间如此不同。我会假设 O(n) 因为它有一个迭代循环。
这是一篇带有漂亮图表的中等文章。
function factorial (n) {
if( n === 0 || n === 1 ) {
return 1;
}
let prev = 1;
let ret;
while(n >= 2) {
ret = prev * n;
prev = ret;
n--;
}
return ret;
}
function factorialR (n) {
if( n === 0 || n === 1 ) {
return 1;
} else {
return n * factorialR(n - 1);
}
}
递归版本似乎需要更长的时间。请参阅此处的 SO Q/A。.
解决方案
是的,这些函数都具有O(n)
计算复杂性,其中 n 是传递给初始函数调用的数字。
第一个函数在循环中为较大和 2 之间的每个值执行 ( O(1)
complexity) 语句,总体复杂度为.while
n
O(n)
第二个函数递归调用自身n
时间,没有任何循环,(再次)整体复杂度为O(n)
.
如果您想降低函数多次调用的计算复杂度,我会创建一个查找表来保存从先前调用计算的值,从而导致m
函数调用运行O(n)
(其中n
是有史以来传递的最高数字),而不是比在(或)时间内m
运行的调用。O(n * m)
O(n^2)
如果
递归版本似乎需要更长的时间。
这不是由于计算复杂性,而是由于编译器如何使用不同的方法。函数调用通常比简单的while
循环有更多的开销(虽然,这种优化在现实生活中几乎从不担心 - 代码的可读性和可维护性在大多数情况下更为重要)。
推荐阅读
- java - 如何在可见的两个视图之间切换?
- linux - 套接字:带有 xenomai 的树莓派上的协议错误不支持地址系列
- python - 在 kivy 画布内播放视频
- android - 如何在 Koin 中使用记录器?
- python - 如何修复 Pyinstaller 属性错误?Python Py Qt5
- kubernetes - Azure Kubernetes Nginx-Ingress 客户端证书身份验证问题
- html - 无法在 webextension 的 contenteditable 中输入斜杠 ('/')
- linux - 在 Linux 中使用自定义规则在多个端口上运行的 SSH 服务
- flutter - 当点击同一页面中的容器时,我应该如何从列表中返回带有一些随机图像的容器?
- java - 处理如何从颜色集合中获取最接近的颜色