js实现递归算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js实现递归算法相关的知识,希望对你有一定的参考价值。
参考技术A <!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实现
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,对数列每次都进行切分,直到不能再切分 ,递归深度为log2n。
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
js代码实现
let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function merge(left,right){ var temp=[]; while(left.length&&right.length){ if(left[0]<right[0]){ temp.push(left.shift()); }else{ temp.push(right.shift()); } } //left和right长度不一样时,直接连接剩下的长的部分(本身有序) return temp.concat(left,right); } function mergeSort(data){ if(data.length<=1){ return data; } var mid=Math.floor(data.length/2); var left=data.slice(0,mid); var right=data.slice(mid); return merge(mergeSort(left),mergeSort(right)); } var sortedData=mergeSort(dat); console.log(sortedData);
以上是关于js实现递归算法的主要内容,如果未能解决你的问题,请参考以下文章