递归
程序调用自身的编程技巧就称之为递归(recursion),就是再运行的过程中调用自己,本质上就是循环.
每个递归函数都有两个部分: 基线条件 和 递归条件,
递归条件 : 函数调用自己
基线条件: 函数不在调用自己,从而避免形成无限循环
递归试例:
let recurrence = function (i) {
console.log("调用"+i)
if(i<=1){
return
}else{
recurrence(i-1)
}
}
recurrence(2)
栈
一个重要的变成概念----调用栈,调用栈不仅对于编程来说很重要,使用递归时也必须理解这个概念。
插入 --- 获取 --- 返回 --- 删除 (个人理解)
这种数据结构称为 栈 ,栈是一种简单的数据结构,我们一直在使用它,却一直没有注意到。
练习
根据下面的调用栈,你可获得哪些信息?
let GREET = function (name) {
GREET2(name)
console.log('GREET-name:'+name)
}
let GREET2 = function (name) {
console.log('GREET2-name:'+name)
}
GREET(MAGGIE)
调用函数GREET 并将 MAFFIE 赋值给name 然后调用GREET2函数 并将 MAFFIE 赋值给name 函数GREET 挂起 运行GREET2 ;GREET2 运行完毕 log出GREET2-name:MAFFIE 然后在执行函数GREET log出GREET-name:MAFFIE
递归调用栈
看代码分析
let fact = function (x) {
console.log(x)
if (x == 1) {
return 1
}else{
return x * fact(x -1)
}
}
console.log(fact(3))
注意 每个fact 函数调用的都有自己的X变量,在一个函数中调用就不能访问另一个的X变量
栈会越来越大 越来大 ,然后会内存溢出?( 内存 = 栈 内存包含栈 )
递归与栈 本章小结
1、递归指的是调用自己的函数
2、每个递归都有两个条件:基线条件和递归条件
3、栈有两种操作: 压入和弹出
4、所以函数调用都进入调用栈
5、调用栈可能很长,这将占用大量内存