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)中去.