We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
递归 Recursion, 在数学与计算机科学中, 是指载函数的定义中使用函数自身的方法
Recursion
在函数内部, 可以调用其他函数. 如果一个函数在内部调用自身本身, 那么这个函数就是递归函数
递归函数
其核心思想就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
一般来说, 递归需要有边界条件, 递归前进阶段和递归返回阶段. 当边界条件不满足时, 递归前进, 当边界条件满足时, 递归结束.
使用迭代的方式 实现一个函数 pow(x, n), 它可以计算 x 的 n 次方
使用迭代的方式
pow(x, n)
x
n
function pow(x, n) { let result = 1 // 循环中, 用 x 乘以 result n 次 for (let i = 0; i < n; i++) { result = result * x } return result } console.info(pow(10, 3))
使用递归的方式
function pow(x, n) { if (n == 1) { return x } else { return x * pow(x, n - 1) } } console.info(pow(10, 4))
-> if (n == 1) => x pow(x, n) -> -> else => x * pow(x, n-1)
pow(2,4)
2 * pow(2,3)
pow(2,3)
2 * pow(2,2)
pow(2,2)
2 * pow(2,1)
pow(2,1) = 2
栈溢出
普通的递归
function factorial(n) { if (n == 1) { return n } return n * factorial(n - 1) } const res = factorial(5) console.info('res', res)
如果 n = 5, 这个方法要执行5次, 才返回最终的计算表达式, 这样每次都要保存这个方法, 就容易造成栈溢出, 复杂度为O(n)
使用尾递归实现阶乘
function factorial(n, total) { if (n === 1) return total return factorial(n - 1, n * total) } const res = factorial(5, 6) console.info('res', res)
function sum(arr, total) { if (arr.length === 1) { return total } else { return sum(arr, total + arr.pop()) } } const nums = [10, 20, 30, 40, 50] sum(nums, nums[0])
let a = [1, 2, 3, [1, 2, 3, [1, 2, 3]]] // 变成 let a = [1, 2, 3, 1, 2, 3, 1, 2, 3] // 具体实现 function flat(arr = [], result = []) { arr.forEach((v) => { if (Array.isArray(v)) { result = result.concat(flat(v, [])) } else { result.push(v) } }) return result }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
JavaScript: 浅谈JS中的 递归 和 尾递归
递归
递归
Recursion
, 在数学与计算机科学中, 是指载函数的定义中使用函数自身的方法在函数内部, 可以调用其他函数. 如果一个函数在内部调用自身本身, 那么这个函数就是
递归函数
其核心思想就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
一般来说, 递归需要有边界条件, 递归前进阶段和递归返回阶段. 当边界条件不满足时, 递归前进, 当边界条件满足时, 递归结束.
使用迭代的方式
实现一个函数pow(x, n)
, 它可以计算x
的n
次方使用递归的方式
pow(x, n)
被调用时, 执行分为两个分支pow(2,4)
, 递归变体经过了下面几个步骤pow(2,4)
=2 * pow(2,3)
pow(2,3)
=2 * pow(2,2)
pow(2,2)
=2 * pow(2,1)
pow(2,1) = 2
尾递归
栈溢出
的错误普通的递归
如果 n = 5, 这个方法要执行5次, 才返回最终的计算表达式, 这样每次都要保存这个方法, 就容易造成栈溢出, 复杂度为O(n)
使用尾递归实现阶乘
应用场景
The text was updated successfully, but these errors were encountered: