算法笔记---- 递归和栈

news/2024/7/4 22:59:22

递归 

程序调用自身的编程技巧就称之为递归(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、调用栈可能很长,这将占用大量内存


http://www.niftyadmin.cn/n/3655860.html

相关文章

C# API方式串口读写

在调试ICU通信设备的时候&#xff0c;由于串口通信老出现故障&#xff0c;所以就怀疑CF实现的SerialPort类是否有问题&#xff0c;所以最后决定用纯API函数实现串口读写。先从网上搜索相关代码&#xff08;关键字&#xff1a;C# API 串口&#xff09;&#xff0c;发现网上相关的…

Windows Mobile 5.0编程—奥运场馆速查

虽然前不久买了一个HP基于windows Mobile 5.0的PDA&#xff0c;由于工作太为繁忙&#xff0c;并没有为之开发相应的程序。没想到微软最近开展了酷炫应用争霸赛,征集“奥运”相关的作品&#xff0c;我忙里偷闲&#xff0c;用VS2005开发了一个关于奥运场馆的小程序&#xff0c;时…

算法笔记 ----- 快速排序

理解部分 D&C 策略&#xff01; D&C算法是递归的。使用D&C解决问题的过程是分为两个步骤&#xff1a; 1 、找到基线条件&#xff0c;这种条件必须尽可能的简单 2、不断的将问题分解(或者说是缩规模), 直到符合基线条件。 D&C并非是解决问题的算法&#xff0c;…

.Net Micro Framework研究—窗体控件

试验平台&#xff1a;.Net Micro Framework 模拟器在Microsoft.SPOT.Presentation.Controls命名空间里&#xff0c;也就如下几个控件&#xff08;姑且称为控件吧&#xff09;&#xff0c;Panel、StackPanel、Text、TextFlow、Image、ListBox、ScrollViewer 其中仅有Panel、Text…

.Net Micro Framework研究—绘图

试验平台&#xff1a;.Net Micro Framework 模拟器目前在VS2005的环境里&#xff0c;还不支持.Net Micro Framework界面的所见即所得绘制&#xff0c;界面制作有三种方式&#xff0c;一是窗体直接绘图&#xff0c;二是Panel形状对象、三是窗体控件。第一种做法让人觉得又回到了…

算法学习笔记----散列表

1.散列函数 散列函数&#xff1a;无论你给它什么数据&#xff0c;它都还你一个数字。 散列函数 将输入映射到数字。你可能认为散列函数输出的数字没什么规律&#xff0c;但其实散列函数必须满足一些要求。 1、它必须是一致的。例如&#xff0c;假如你输入apple时得到的是4&…

JavaScript -------- 数组1

一、创建数组 通过 [] 操作符声明一个数组变量&#xff1a; var numbers [ ] 得到一个长度为0的空数组。 可以通过内建的length属性 console.log(numbers.length) // 0 在声明数组变量时&#xff0c;直接在 [ ] 操作符中放入一组元素&#xff1b; var numbers [1,…

.Net Micro Framework研究—Shapes命名空间

试验平台&#xff1a;.Net Micro Framework 模拟器在Microsoft.SPOT.Presentation.Shapes命名空间下&#xff0c;包含几个形状对象&#xff0c;主要有Ellipse、Line、Polygon、Rectangle&#xff0c;同样也只有Rectangle实现的最好&#xff0c;其他形状都不支持填充色&#xff…