⑴ js遞歸通俗的理解
所謂的遞歸函數就是在函數體內調用本函數。使用遞歸函數一定要注意回,處理不當就會進入死循環。遞答歸函數只有在特定的情況下使用 ,比如階乘問題
下面做一個10以內的階乘試試看:
functionfact(num){
if(num<=1){
return1;
}else{
returnnum*fact(num-1);
}
}
⑵ 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
⑶ javascript 遞歸,根據index 取出name
functiontest2(data,index){
varresult,temp;//返回值和臨時變數
for(variindata){
temp=data[i];
if(temp['name']&&temp['index']==index){
result=temp['name'];
break;//如果已經返回了就中止
}
//如果還沒有找到則遍歷menus參數專下屬的數據
if(typeofresult=='undefined'&&temp['menus']){
result=test2(temp['menus'],index);
}
}
returnresult;
}
⑷ 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遞歸函數求[1,[2],[3,[4]]] 返回值為[1,2,3,4]
varyugi=function(arr,result){
for(vari=0;i<arr.length;i++){
vartmp=arr[i];
if(tmp.join){
yugi(tmp,result);
}else{
result.push(tmp);
}
}
}
varresult=[];
yugi([1,[2],[3,[4]]],result);
console.log(result);
⑹ javascript遞歸函數 求js高手解答,要實現一個根據路徑獲取json對象值的函數,有很多不明白的地方
遞歸經常碰到的問題了。
出問題的地方是 Run(temp,path);
既然是遞歸的調用 而且這個函數本身 有 return 值 那麼 你應該在
調用 Run(temp,path);的時候 接收他的返回值
應該寫成 value = Run(temp,path);
1. 現在你可以設成 局部變數 var value 了。
之所以出現undefined就是因為
return value 這行代碼 就執行了 1次 也就是 第一個執行 var test=Run(myjson,mypath);的時候
這個時候 value 變數還沒有定義出來, value是在 最後一次執行 Run(temp,path);的時候才定義的,而需要把這個 返回出來 並接收 才有效。
2. json=json[path[0]],
這個地方 不會報錯 你是寫錯了代碼
你如果 把這個地方 寫成 json=json[path[0]],
那麼下面 Run(temp,path); 是不是也應該寫成 Run(json,path);呢?
這樣就不會報錯。
3. 在javascript里 數組和 對象 都是屬於 引用類型的, 這是為了 節省內存空間。
其實道理簡單, var a = {b:1} 這個時候 a變數裡面 存儲的是 保存這個 對象的內存地址,
打個比方 這個對象是一個寶箱 他是隱藏在內存的, a變數裡面是打開這個寶箱的鑰匙和地圖
那麼 b=a的時候 只是 復制了 鑰匙和地圖, 寶箱還是一個, 所以這個時候 a 和b 是指同一個對象的。
最後代碼 修改後是這樣
function Run(json,path){
if(path.length<=1){
var value=json[path[0]]; // 如果這里換成var value=json[path[0]]結果是undefined
} else {
var temp;
json=json[path[0]]; //這里為什麼不能用 json=json[path[0]]
path.splice(0,1);
value = Run(json,path);
//arguments.callee(temp,path);
}
return value;
}
var myjson={a:1,b:{c:{e:3},d:4}};
var mypath=['b','c','e'];
var test=Run(myjson,mypath);
alert(test);