javascript - 另一个 JavaScript 递归函数

标签 javascript recursion

有人可以直观地解释这里发生了什么吗?

var stack = [];

function countDown(int) {
    stack.push(int);
    if (int === 1) {
        return 1;
    }
    return countDown(int - 1);
}

function multiplyEach() {
    // Remove the last value of the stack
    // and assign it to the variable int
    int = stack.pop();
    x = stack.length;
    // Base case
    if (x === 0) {
        return int;
    }
    // Recursive case
    else {
        stack[x - 1] = int * stack[x - 1];
        return multiplyEach();
    }
}

//调用函数

 countDown(7);

//然后打印出multiplyEach()返回的值

console.log(multiplyEach());

我有点明白,它正在创建一个堆栈,并将所有内容相乘,但我无法想象它。

然后:

Stack[x-1] is getting me

最佳答案

这是一个由两部分组成的算法。

首先 countDown(n) 用从 n1 的值填充数组 stack,因此 堆栈 = [n, n-1, n-2, ..., 3, 2, 1]countDown 的返回值从未被使用,因此可以忽略 return 语句。唯一重要的是它按照解释填充了 stack 数组。

其次,multiplyEach 重复获取堆栈的最后一个元素,将其删除,并将其与数组中的下一个最后一个元素相乘:

[n, n-1, n-2, ..., 6, 5, 4, 3, 2, 1]
[n, n-1, n-2, ..., 6, 5, 4, 3, 2]
[n, n-1, n-2, ..., 6, 5, 4, 6]
[n, n-1, n-2, ..., 6, 5, 24]
[n, n-1, n-2, ..., 6, 120]
...
[n!]

换句话说,该算法计算提供给 countDown 的数字 n 的阶乘。

关于javascript - 另一个 JavaScript 递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993420/

相关文章:

javascript - React Native - 如何为单个字符(数字、字母等)设置固定宽度

javascript - 通过 React Native 中的 fetch 从请求 api 获取状态和数据

javascript - d3.js 同一页面上的两个图相互重叠

javascript - laravel 完整日历不适用于主题 JQuery 和 Bootstrap

javascript - 按顺序递归元素

python - 递归扫描文件并删除python中的空目录

c++ - 在 boost::spirit::qi 语法中处理深度递归的正确方法是什么?

java - 二维数组中具有重复的排列列表

python - 我如何证明和分析代码的运行时间,是 O(n) 吗?

javascript - 使用 .filter 过滤对象数组