帮助理解递归和指数 - JavaScript

时间:2017-10-10 10:55:25

标签: javascript recursion

我是新人,并且一直在努力尝试在我的大脑中对此进行合理化,但似乎无法理解它。首先是许多人使用简单的" for"循环:

function power(base, exponent){
 var result = 1;
  for(var i = 0; i < exponent; i++){
   if(exponent == 0)
    return 1;
   else
    result *= base;
 };
 return result;
}

在本节中,我将阅读有关递归和讨论函数如何调用自身的内容,只要它不会导致堆栈溢出。代码如下:

function power(base, exponent) {
  if (exponent == 0)
return 1;
  else
return base * power(base, exponent - 1);
}

console.log(power(2, 3));

我遇到的问题是理解它是如何运作的,这就是我认为正在发生的事情:

经过第一次&#34;如果&#34;声明它移动到&#34;否则&#34;并且调用自身返回if语句的顶部,减去1,每次直到它达到0,它将返回&#34;结果&#34;。是对的吗?或者我完全错过了什么?

2 个答案:

答案 0 :(得分:1)

好的,让我们分一步看看:

你致电pow(2, 3)

首先,它运行此代码:

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}

代入值:

function power(base /* 2 */, exponent /* 3 */) {
  if (3 == 0)
    return 1;
  else
    return 2 * power(2, 2);
}

加快这个答案,我将从现在开始将它呈现在一个表格中:

第一个电话解析为

1)2 * power(2, 2);

2)2 * (2 * power(2, 1))

3)2 * (2 * (2))

(在最后一个,指数是1,所以它返回基数或2)

每次循环时,它基本上是基础的答案

就像循环一样,在示例中,

2 * (2 * (2)) === 8,所以power(2, 3) === 8

答案 1 :(得分:0)

递归不是迭代的,它不会使函数返回任何地方,它使函数启动自身的另一个实例以进一步解决其结果。

让我们考虑一个更简单的例子。此函数从给定数字向下计数到0,并且每次可被5整除时都会大喊“FIVE”和当前数字:

function foo(anumber)
{
    if(anumber <= 0)
    {
        console.log("Reached 0, done.");
    }
    else
    {
        if(anumber % 5 == 0)
        {
            console.log("FIVE - " + anumber);
        }
        foo(anumber - 1);
    }
}

foo检查数字是否等于或小于零,如果不是,检查它是否可被5整除,如果是,则大喊大叫,无论是否发起另一个foo检查数字更低一个人。当foo的实例最终达到0时,链不会继续并且堆栈崩溃。

这种递归的简单使用几乎只用于函数式编程,它规定变量和迭代循环对代码都不好并导致混乱。通常它使用循环更简单,通常RAM更高效。

递归只有更复杂的例子才能发挥其潜力,但我确信基础知识解释了解那些不会成为问题。