for 循环内部调用的递归函数的大 O 表示法
Big O notation of recursion function called inside for loop
我正在尝试确定几种算法的大 O 复杂度,但我无法理解如何推理以下代码:
void recursiveFunc (n)
{
for(int i = 0; i < 8; i++)
{
if (n < maxN)
{
recursiveFunc (n + 1);
}
else
{
for(int j = 0; j < 8; j++)
{
// do some stuff
}
}
}
}
我认为这是一个指数函数,因为递归函数是在循环内部调用的。 O(8 ^ n)?
但我对如何推理它有点迷茫。
你的提示是正确的。
给定代码:
var maxN = 16;
var initN = 0;
var count = 0;
function recursiveFunc (n) {
for(var i = 0; i < 8; i++) {
if (n < maxN) {
recursiveFunc (n + 1);
} else {
for(int j = 0; j < 8; j++) {
count++;
}
}
}
}
recursiveFunc(initN);
第一次调用发生在 n = 0:
8^1 次 recursiveFunc 调用(其中 n = 1)
调用 n = 1 然后导致:8^2 次调用 recursiveFunc
...
调用 n = (maxN - 1) then cause: 8^maxN calls of recursiveFunc => visiting else branch, each call enters "some stuff" 64 times
第一次调用发生在 n = 2,maxN = 4 时:
8^1 次 recursiveFunc 调用(其中 n = 3)
调用 n = 3 然后导致:8^2 次调用 recursiveFunc(其中 n = 4)
调用 n = 4 然后访问 else 分支,每次 64 次。
因此进入"some stuff"阶段的总次数:64 * (8^(maxN - initN))
O(8^n)
编辑:您可以在此处看到它的工作,只需单击 "Run the snippet",然后点击 "Test" 按钮。 (尝试更大的 maxN 值可能会使您的浏览器崩溃)
function test () {
var maxN = parseInt(document.querySelector("#nmax").value);
var initN = parseInt(document.querySelector("#n").value);
var count = 0;
function recursiveFunc (n) {
for(var i = 0; i < 8; i++) {
if (n < maxN) {
recursiveFunc (n + 1);
} else {
for(var j = 0; j < 8; j++) {
count++;
}
}
}
}
recursiveFunc(initN);
document.querySelector("#expectedValue").innerHTML = 64 * (Math.pow(8, maxN - initN));// 64 * (8^(maxN - initN));
document.querySelector("#realValue").innerHTML = count;
}
N: <input type=number id=n value=0><br>
NMAX: <input type=number id=nmax value=5><br>
<hr>
Expected value: <span id=expectedValue></span><br>
Real value: <span id=realValue></span><br>
<button onclick="test()">Test</button>
(我还假设 initN <= maxN)
我正在尝试确定几种算法的大 O 复杂度,但我无法理解如何推理以下代码:
void recursiveFunc (n)
{
for(int i = 0; i < 8; i++)
{
if (n < maxN)
{
recursiveFunc (n + 1);
}
else
{
for(int j = 0; j < 8; j++)
{
// do some stuff
}
}
}
}
我认为这是一个指数函数,因为递归函数是在循环内部调用的。 O(8 ^ n)? 但我对如何推理它有点迷茫。
你的提示是正确的。
给定代码:
var maxN = 16;
var initN = 0;
var count = 0;
function recursiveFunc (n) {
for(var i = 0; i < 8; i++) {
if (n < maxN) {
recursiveFunc (n + 1);
} else {
for(int j = 0; j < 8; j++) {
count++;
}
}
}
}
recursiveFunc(initN);
第一次调用发生在 n = 0:
8^1 次 recursiveFunc 调用(其中 n = 1)
调用 n = 1 然后导致:8^2 次调用 recursiveFunc
...
调用 n = (maxN - 1) then cause: 8^maxN calls of recursiveFunc => visiting else branch, each call enters "some stuff" 64 times
第一次调用发生在 n = 2,maxN = 4 时:
8^1 次 recursiveFunc 调用(其中 n = 3)
调用 n = 3 然后导致:8^2 次调用 recursiveFunc(其中 n = 4)
调用 n = 4 然后访问 else 分支,每次 64 次。
因此进入"some stuff"阶段的总次数:64 * (8^(maxN - initN))
O(8^n)
编辑:您可以在此处看到它的工作,只需单击 "Run the snippet",然后点击 "Test" 按钮。 (尝试更大的 maxN 值可能会使您的浏览器崩溃)
function test () {
var maxN = parseInt(document.querySelector("#nmax").value);
var initN = parseInt(document.querySelector("#n").value);
var count = 0;
function recursiveFunc (n) {
for(var i = 0; i < 8; i++) {
if (n < maxN) {
recursiveFunc (n + 1);
} else {
for(var j = 0; j < 8; j++) {
count++;
}
}
}
}
recursiveFunc(initN);
document.querySelector("#expectedValue").innerHTML = 64 * (Math.pow(8, maxN - initN));// 64 * (8^(maxN - initN));
document.querySelector("#realValue").innerHTML = count;
}
N: <input type=number id=n value=0><br>
NMAX: <input type=number id=nmax value=5><br>
<hr>
Expected value: <span id=expectedValue></span><br>
Real value: <span id=realValue></span><br>
<button onclick="test()">Test</button>
(我还假设 initN <= maxN)