遞歸函數

假如一個函數或子程序,是由自身所定義或調用的,就稱爲遞歸。遞歸至少要定義兩種條件:一個是能夠反覆執行的遞歸過程,和一個跳出執行過程的出口。算法

 漢諾塔問題函數

  說是在古印度神廟,廟中有3根木樁,天神但願和尚們把某些數量大小不一樣的盤子,從第一個木樁所有移到第三個木樁。即假設有a,b、c三個木樁和n個大小不相同的盤子,從小到大編碼爲一、二、3...n,編號越大,直徑越大,開始的時候,n個盤子都放在木樁a上,如今但願能找到將木樁a上的盤子藉着木樁b當橋樑,所有移到木樁c上的最少次數的方法(直徑小的盤子永遠只能放在直徑大的盤子的上面;盤子能夠任意移動到其餘木樁上;每次只能移動一個盤子)。分析漢諾塔問題能夠發現,它知足了遞歸的兩大特色:1,有反覆執行的過程;2,有中止的出口。編碼

  漢諾塔的算法就3個步驟:第一,把a上的n-1個盤經過c移動到b。第二,把a上的最下面的盤移到c。第三,由於n-1個盤全在b上了,因此把b當作a重複以上步驟就行了。用代碼實現爲spa

function hanoi(n,p1,p2,p3){ if(n==1){//遞歸出口
        console.log("盤子從"+p1+"移動到"+p3); }else{ hanoi(n-1,p1,p3,p2) console.log('~盤子從'+p1+'移動到'+p3) hanoi(n-1,p2,p1,p3) } } let hanoi = (n,p1,p2,p3) => {   if(n==1){     console.log("盤子從"+p1+"移動到"+p3);   }else{     hanoi(n-1,p1,p3,p2)     console.log('~盤子從'+p1+'移動到'+p3)     hanoi(n-1,p2,p1,p3)   } }

 

斐波拉契數列code

斐波拉契數列的基本定義是,一個數列的第零項是0,第一項是1,這個數列其餘後續的值是前面兩項的數列之和。一樣符合遞歸的兩個特徵。blog

function factorial(i){   if(i==0){//跳出執行過程的出口
    return 0;   }else if(i==1){     return 1;   }else{     return factorial(i-1)+factorial(i-2);   } } let factorial = (i) => {   if(i==0){//跳出執行過程的出口
    return 0;   }else if(i==1){     return 1;   }else{     return factorial(i-1)+factorial(i-2);   } }
相關文章
相關標籤/搜索