Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
How does Eloquent JavaScript recursion example terminate as return 1 but still output exponential value
在下面的代码中,我完全理解它是如何工作的,直到终止和"return 1"。我假设,一旦函数终止,它应该输出1,但它会按照指数程序的预期执行,它会输出正确的答案,在这种情况下是9。
我的问题是为什么会这样?
我认为我可视化递归的方式是不正确的(也许是我对堆栈如何处理递归的想法?)我在这里发现了一个与我类似的问题,但这对我的理解没有帮助。
function power(base,exponent){
if(exponent === 0){
return 1 // Terminates with return 1 but output is correct
}
return base * power(base, exponent-=1);
}
power(3,2)//此输出9而非1。为什么?
递归函数的工作原理如下:
首先,函数将返回3 * power(3, 1)
。
现在您只调用右侧的函数,所以只有该值才能解析,这样它才会变成。
3 * 3 * power(3,0)
同样,只有最右边的部分是一个必须解决的函数。
因此:
3*3*1
没有更多的函数可解析,所以第一个函数将结果作为9
提供给您。
它类似于
var x = multiple(3,1) * multiple(3,2) * multiple (3,4);
现在,所有这些函数都将从左到右执行。
因此,一旦所有函数都被解析,x的值就会被计算出来。
对于递归算法,必须至少有一个基本情况;递归最终将到达基本情况。你的基本情况是1
,然后base * power(base, exponent-1)
递归,直到它碰到基本情况,这时它会给你留下return base * 1
,也就是base
,然后堆栈会解开,直到它返回结果。
为了可视化power(3, 3)
的递归,您可以首先编写流程:
3 * power(3, 2)
3 * power(3, 1)
3 * power(3, 0)
现在转到上面并替换从基本情况(最后一行)开始的递归调用。
3 * power(3, 2)
3 * power(3, 1)
3 * power(3, 0) = 3 * 1 = 3
// we know power(3, 0) = 1; this is the base case
现在,将结果进位,对其余部分执行相同操作,直到获得最终值:
3 * power(3, 2) = 3 * 9 = 27
3 * power(3, 1) = 3 * 3 = 9
3 * power(3, 0) = 3 * 1 = 3
相关文章:
- 节点导出返回一个空对象
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 控制台返回var不是't定义,但它是
- 从函数返回角度承诺
- Javascript返回值只在循环中返回一次
- 从控制器返回后Ajax启动事件激发
- CKFinder 3为所选文件返回错误的URL
- 如何在d3.js中返回路径的y坐标
- 如何从jquery函数返回变量
- Angular js-返回一个包含类似
- JSONP请求返回结果,但也触发error_callback
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- JS验证ajax返回的html中的表单数据
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- AJAX:$_GET不返回任何值
- 从Javascript方法返回全局变量
- 对负指数调用的.toFixed()返回一个数字,而不是字符串
- Openssl_pkey_get_details ($res)不返回公共指数