js递归算法
Ⅰ js的promise如何递归调用
递饥塌归是Promise机制的核心之一:then方法返回另一个promise2,其内容是由回烂告圆调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容,也友旦就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可
举例如下:
//假如用jQuery
function get(url, p) {
return $.get(url + "?page=" + p)
.then(function(data) {
if(!data.list.length) {//递归结束条件
return [];
}
return get(url, p+1)//递归调用
.then(function(nextList) {
return [].concat(data.list, nextList);//合并递归内容
});
});
}
get("urlurl", 1).then(function(list) {
console.log(list);//your full list is here
});
Ⅱ js关于递归里的return
首先看题主的代码,按照要求,去掉函数中最后一个
return
首先
调用
total(9),这时
total中
i
的值为
9,
然后执行
if
条件
i
%
n
==
0
(9
%
1
==
0),结果为true,进入执行
sum
=
sum+n,然后执行
n++
(n
=
2);然后执行
if
条件
n
>
i
(
2
>
9),结果为
false,跳过
if,
执行下一步
total(i)
问题就出现在这里,执行第一层的时候猜尺
total
函数并没有返回值,当total
进入最后一层穗模高循环的时候,即便是返回了
sum,
因为前面的几层并没有返回,所以最后结果就会是
undefined
所以码前,想要最终有结果返回,即便是递归,也得保证层层有
return
Ⅲ JS常见排序算法
排序算法说明:
(1)对于评述算法优劣术语的说明
稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序 :所有排序操作都在内存中完成;
外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度 : 一个算法执行所耗费的时间。
空间复杂度 : 运行完一个程序所需内存的大小。
(2)排序算法图片总结:
1.冒泡排序:
解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。
2.第一轮的时候最后一个元素应该是最大的一个。
3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。
2.快速排序:
解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。
3.插入排序:
解析:
(1) 从第一个元素开始,该元素可以认为已经被排序
(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)将新元素插入到下一位置中
(6) 重复步骤2
2.二分查找:
解析:二分查找,也为折半查找。首先要找到一个中间值,通过与中间值比较,大的放又,小的放在左边。再在两边中寻找中间值,持续以上操作,直到找到所在位置为止。
(1)递归方法
(2)非递归方法
4.选择排序:
解析:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
5.希尔排序:
解析:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
6.归并排序:
解析:归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
7.堆排序:
解析:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是
小于(或者大于)它的父节点。
8.计数排序:
解析:计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
9.桶排序:
解析:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排
10.基数排序:
解析:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优
先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
基数排序:根据键值的每位数字来分配桶 计数排序:每个桶只存储单一键值 桶排序:每个桶存储一定范围的数值
Ⅳ js递归通俗的理解
所谓的型困返递归函数就是在函数体内调用本函数。使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题
下面做一个10以内的阶乘试试看:
functionfact(num){
if(num<=1){
尺猛return1;
卜饥}else{
returnnum*fact(num-1);
}
}
Ⅳ JS递归的常见用法
求 1-100 的和
1,1,2,3,5,8,13,21,34,55,89...求第 n 项
JS 递归 假如楼梯有 n 个台阶,每次可以亏裂走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法
原理: clone(o) = new Object; 返回一个对象
1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一丛空雀致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。
5、递归实现的快速排序比普通遍历实现的排序效率更好渗早。
Ⅵ js-递归方法
首先先解释一下什么是递归函数:什么是递归方法:就是一个方法,自己调用自己
但是一定要注意控制好合适的跳出,不然就会死循环,如图:
所以我们平时一定要注意,递归函数里调用函数本身的时候一定要要合理的控制循环跳出的语句;比如我们来看一题很经典的面试题,请用递归方法算出1-20之间每个数的和
function calc(num){
//这个if是退出递归的条件
if(num===1) { //如果没有这个if条件
歼简 return num
}
return num + calc(num-1) //
伏改氏 }
console.log(calc(3)) //这里为了方便我们理解我们可以先用num===3替代进去,具体的方式以及步骤分解可以看图:
如果有大佬有更好的理缺散解方法,可以留言或者私信哦,互相学习,互相进步~~~
Ⅶ 这是一个Javascript函数,为什么最后要写上 return (1);呢
其实这是很基础的东西的,一个运算里有一个IF条件句的,这样形成一个分支,你可能没有看到else,但这个分支与有else是一样的.因为return会返回出整个函数,也就是说if条件成立,则return (calc(n-1)*n)进行返回了,就没有机会再去执行return (1)这样的一迅敬旅个语句了!
但这个三楼说的没错,这是一个自身调用的递归函数,也就是说在函数的内部自身调用了自身.但是递归函数必须有稿指另一个特性,就是有穷性,最终必须要调用到一个有尽的情况,而return (1)就是保证了这个有尽性的,否则你的递归一条调用下去不就成了死循环了吗?
从算法上也一眼可以看出,这是一个计算阶乘的递归算法的.三楼的解释是不错的,比较着我的说明,你就能理解的.
但对于这类的问题,只用来\学习的,因为递归调用要不断的保留现场,所以对于内存的使用特别大的消橇的,一般这样的程序改为循环就可以了,没有必须使用递归的.这里可能是一个书亩凳上的例子教你递归的使用方法呢!
Ⅷ js实现递归算法
<!DOCTYPE >
<html>
<head>
<meta content="" charset="utf-8">
<title>函李迹蚂数的递归调用</title>
</head>
<body>
<script>
//递归的概念:自己调用自己
//注意:使用递归的时候必须有一个结束标志,否则会报内存溢州镇出的错误 Maximum call stack size exceeded;
/* 1.案例一:求1,2,3...n 的和 */
function fn(n){
if(n===1){
return 1;
}
return n+fn(n-1);
}
//console.log(fn(3));
/* 2.案例二:求1,2,3...到n的阶乘 */
function getFactorial(n){
if(n===1){
return 1;
}
return n * getFactorial(n-1);
}
/哪埋/console.log(getFactorial(3));
/* 案例三:斐波那契数列 *///第n个数等于前两个数的和,除第一个数跟第二个树外:如1,1,2,3,5,8,11,19,30...
function getNFibonacciSequence(n){
if(n===1 || n===2){
return 1;
}
return getNFibonacciSequence(n-1)+getNFibonacciSequence(n-2);
}
console.log(getNFibonacciSequence(4));
</script>
</body>
</html>
Ⅸ JS 深度优先遍历(DFS)和广度优先遍历(BFS)
深度优先遍历DFS
自定义:深度单线游走,从根走完最后一个节点,在游走兄弟节点,走完兄弟的所有子节点,循环之。
银高返 递归算法:
function deepFirstSearch(node, nodeList = []) {
if (node) {
nodeList.push(node);
var children = node.children;
for (var i = 0; i < children.length; i++)
//每次递归的时候将 需要遍历的节点 和 节点所存储的数组传下去
deepFirstSearch(children[i], nodeList);
}
return nodeList;
}
非递归算法:
function deepFirstSearch(node) {
var nodes = [];
if (node != null) {
var stack = [];
stack.push(node);
while (stack.length != 0) {
var item = stack.pop();
nodes.push(item);
var children = item.children;
for (var i = children.length - 1; i >= 0; i--)
stack.push(children[i]);
}
}
return nodes;
}
广度优先遍历(BFS)
自定义:从根开始 层层推进 走完一层 走下一层 (犹如爬楼,走完一层的楼梯,继续下一层的楼梯)
递锋饥归算法:(容易念森栈溢出)
function breadthFirstSearch(node) {
var nodes = [];
var i = 0;
if (!(node == null)) {
nodes.push(node);
breadthFirstSearch(node.nextElementSibling);
node = nodes[i++];
breadthFirstSearch(node.firstElementChild);
}
return nodes;
}
非递归算法:(推荐)
function breadthFirstSearch(node) {
var nodes = [];
if (node != null) {
var queue = [];
queue.unshift(node);
while (queue.length != 0) {
var item = queue.shift();
nodes.push(item);
var children = item.children;
for (var i = 0; i < children.length; i++)
queue.push(children[i]);
}
}
return nodes;
}
Ⅹ JS中归递算法的问题
return的意思就是退出当前函数基闷,并且让函数给出一个值.
比如说最简单的,
function func(){
return 1;
}
那么调用
alert(func())
自然可以获得1,因为return的时候返回了一个值1,那么退出"func()"这部分计算的时候,就会获得一个1.
只需要牢记这一点就可以很容易的理解递归.
函数内部调用函旁漏数,就和普通的函数调用一样,return永远是跳出当前的函数而已,至于跳出去了是什么地方,那要看你是从什么地方"跳进来"这个函数的.
具体到你的例子,这是一个利用递搏启弯归计算阶乘的函数.无论是否n=1,return都返回到上级函数,也就是调用这个函数的函数.
比如说,计算f(4)的时候会调用到f(3),那么f(3)运行完毕返回的6就会被f(4)中的式子n*f(n-1)所计算,然后继续返回到主程序中.而由于计算f(1)不需要调用任何函数,那么就会直接返回1到调用它的f(2)中去.