迭代和遞歸的代碼比較(js)


 

 

迭代

  更省性能,效率高

  只更換房間內的物品

 

遞歸

  更耗性能,效率低

  占用很多房間,每個房間都放物品,直到進入了最后一道防線(設置的出口),然后再開始運算...

 

感受

  看到很多人吹爆了遞歸,說這更貼近人的思維,是神一樣的存在之類。所以才有了這篇隨筆。

  更貼近人的思維?你家的人的思維是拿到一道類似階層、斐波那契數列的題目,是倒推到“原點”,然后再一個個計算出來嗎?(are u kidding me?)

  你中學的數學題,難道不是用迭代的思維寫的解題過程?

  以此類推,遞歸更加貼近人的思維的說法根本站不住腳,只是你習慣了遞歸的簡潔寫法,哪怕代價是忽略了性能而已。——如果你喜歡遞歸而非迭代,那么你可能很少動腦了。

  知道自己想要寫的是什么效果,那么迭代和遞歸,對我們來說都一樣的。

  如果是我,我寫迭代的時候比寫遞歸的時候順一點,因為我可能會忘了設置出口,調試的時候才發現好像有什么不對... 當然,這也和我很少寫遞歸有關。

  最后,我想說的是,代碼的藝術,是用更少的代碼,寫更多的功能的同時,也是用更有限的性能,寫出更多的功能。追求性能極致是很酷的一件事。——尤其在思維而非語言的時候。

 

例子

  階層和斐波那契數列

 

 

/*
迭代 n的階層
*/
function f(n){
    if(0===n) return 0;
    let z=1;
    for(let i=1; i<=n; i++){
        z *= i;
    }
    return z;
};

/*
迭代 斐波那契數列
*/
function d(n){
    if(1===n || 2===n) return 1;
    if(n<=0) return;
    let z =1;
    let x =1;
    for(let i=3; i<=n;i++){
        z +=x;
        x = z-x;
    } 
    return z;
}


/*
遞歸 n的階層
*/
function f2(n){
    if(1===n) return 1;
    return n*f2(n-1);
};

/*
遞歸 斐波那契數列
*/
function d2(n){
    if(1===n || 2===n) return 1;
    return d2(n-1) + d2(n-2);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM