有人可以解释一下返回语句如何在javascript中使用递归?

时间:2017-01-22 00:00:38

标签: javascript recursion

我已经检查了论坛,我看到一些有类似标题但没有一个回答我的问题。我注意到如果我创建一个递归函数,则return语句在终止语句之后返回。有人能解释一下这对我有用吗?感谢

function recur(n=10){
  if(n===0){
    return "";
  }
  console.log(n);
  return "A" + recur(n-1);
}

recur()

最终结果是:

10
9
8
7
6
5
4
3
2
1
"AAAAAAAAAA"

我希望它为函数的每个实例返回A,因为我认为函数定义中的每个语句都会为函数的每个实例调用,如下所示:

10
"A"
9
"A"
8
"A"
7
"A"
6
"A"
5
"A"
4
"A"
3
"A"
2
"A"
1
"A"

所以要重申为什么函数没有像我期望的那样返回A,函数如何运作的模式我误解了?

5 个答案:

答案 0 :(得分:4)

这样做可能有助于您理解:

recur(5) = "A" + recur(4)
         = "A" + ("A" + recur(3))
         = "A" + ("A" + ("A" + recur(2)))
         = "A" + ("A" + ("A" + ("A" + recur(1))))
         = "A" + ("A" + ("A" + ("A" + ("A" + recur(0)))))
         = "A" + ("A" + ("A" + ("A" + ("A" + ""))))
         = "A" + ("A" + ("A" + ("A" + ("A"))))
         = "A" + ("A" + ("A" + ("AA")))
         = "A" + ("A" + ("AAA"))
         = "A" + ("AAAA")
         = "AAAAA"

因此recur(5)会返回"AAAAA"。您应该能够扩展此推理,以显示recur(10)返回"AAAAAAAAAA"

您每次都打印n的值,一个整数,打印每个递归调用recur的结果。最后看到的"AAAAAAAAAA"是你的控制台(shell,REPL,...)显示你执行的所有内容的结果;在这种情况下,您会在调用recur()时看到此内容,这与recur(10)相同。

如果要“跟踪”该功能,可以将结果分配给变量然后将其返回。试试这个:

$ node
> function recur(n=10){
...   if(n===0){
.....     return "";
.....   }
...   let result = "A" + recur(n-1);
...   console.log(n, result);
...   return result;
... }
undefined
> recur()
1 'A'
2 'AA'
3 'AAA'
4 'AAAA'
5 'AAAAA'
6 'AAAAAA'
7 'AAAAAAA'
8 'AAAAAAAA'
9 'AAAAAAAAA'
10 'AAAAAAAAAA'

答案 1 :(得分:2)

我假设你在浏览器控制台,节点shell或类似的东西中执行此操作。代码输出参数的每个值(除非它是0)并且不输出任何" A"一点都不shell /控制台只是回显函数返回的值;在这种情况下,您是对recur()的顶级电话。顶级呼叫评估为" AAAAAAAAAA"是每个函数调用附加一个" A"到递归调用的值。 (n===0的基本案例返回一个空字符串。)

如果你想打印" A"每次,您都必须将自己的输出语句添加到代码中。 shell返回后仍然会打印顶级调用的返回值。

答案 2 :(得分:2)

您正在从函数返回'A',而不是每次都打印它。新的A连接到每个递归调用的返回值。您想要的结果应该是:

function recur(n=10){
  if(n===0){
    return "";
  }
  console.log(n);
  console.log("A");
  return recur(n-1);
}

答案 3 :(得分:1)

尝试运行此功能,可能会让您更直观地了解正在发生的事情。

function recur(n=10){
  if(n === 0){
    return "";
 }
 var recursiveResult = "A" + recur(n-1);
 console.log(n);
 console.log(recursiveResult);

 return recursiveResult;
}

console.log(recur(10));

递归函数不应该为每个"循环"返回相同的结果。递归函数。否则,你不需要递归:)。

enter image description here

答案 4 :(得分:0)

避免使用“函数实例”来表示“调用函数”。从技术上讲,它们完全不同。代码示例中有一个recur实例,被调用(即调用)11次。

前10个调用中的任何一个都不能返回,直到它们返回的表达式 ("A" + recur(n-1)')。已被评估。第十一次调用首先返回。之前的调用以其调用的相反顺序返回,之后因为它们返回的表达式已完成评估。