首頁 >web前端 >js教程 >JavaScript的遞迴更多例子

JavaScript的遞迴更多例子

高洛峰
高洛峰原創
2016-11-28 11:36:08967瀏覽

更多例子

第二個遞歸的例子是求兩個自然數的最大公約數(有沒有回到令人懷念的中學時代)。下面的程序用的是經典的輾轉相除法。


[javascript]
//greatest common divisor  
//假定a、b都是正整數  
function gcd(a, b){   awwn if (a = b  
    var c = a % b; 
    if (c === 0) 
        return b;  

//greatest common divisor
//假定a、 b都是正整數
function gcd(a, b){

 if (a = b

 var c = a % b;
 if (c === 0)
  return b;
 else
  return gcd(b, c);
}
除了上面這些條件或者解法可以轉化為數學的遞歸定義的計算,遞歸方法還適用於其所涉及的數據結構即是解法可以轉化為數學的遞歸定義的計算,遞歸方法還適用於其所涉及的數據結構即是以以遞歸形式定義的問題,例如鍊錶、圖、樹等等。

現在我們來看一個迷宮的例子。迷宮可以抽象化成數學上的圖,每個岔路口都是點,其間的路是邊。兩個特殊的點,分別被定義成入口和出口。

下面是用Javascript定義的點和圖。每個點包含一個id作為編號和標誌,相鄰的點被保存在一個陣列中。圖有一個添加點的方法,和一個更方便使用的直接添加點的id的方法;還有一個添加邊的方法。

[javascript]

//define a vertex  

function Vertex(id){ 

    var stem={}; 

   
}  
//define a graph  
function Graph(){ 
    var stem={}, vertices={}; 
    //add vertices to the graph   ray){ 
            for (var i=0 
               vertices[v[i].id]=v[i]  
        vertices[vertex.id]=vertex; 
    } 
    //create vertices from ids and add them to the graph  
    function addIds(ids){ 
        var id;          id=ids[i]; 
            vertices[id] =Vertex(id); 
        }    
    } 
    //create an edgevert    var v1=vertices[i1], v2=vertices[i2]; 
        if (v1 && v2 ){ 
            v1.adjacent.push(v2); 
           
    stem.vertices=vertices; 
    stem.add=add; 
    stem.addIds=addIds; 
    stem. connect=connect; 
    return stem; 

//定義一個頂點
function Vertex(id){
 var Stem={};
 stem.id=id;
 stem.adjacent=[];
 return Stem;
}
/定義一個圖
/圖片(){
 var Stem={}, vertices={};
 //向圖中加入頂點
 function add(vertex){
  if (vertex vertnceof Array){
){
  if (vertex vertnceof Array){
){
  if (vertex vertvarsŠ i    vertices[v[i].id]=v[i];
   }
  }
  vertices[exex.id]=vertexex;將它們加到圖表
 函數addIds(ids){
  var id;
  for (var i=0; i   id=ids[i];
; ) ;
  } 
 }
 //在兩個頂點之間創建一條邊
 function connect(i1, i2){
  var v1=vertices[i1], v2=vertices[
  var v1=vertices[i1], v2=vertices[
  var v1=vertices[i1], v2=vertices[
  var v1=vertices[i1], v2=vertices[
  var v. {
   v1.鄰近.push(v2);
   v2.adjacent.push(v1);
  }
 }
 stem.vertices=頂點;🎠.; connect=連接;
return Stem;

}我們走出迷宮每個的思路是從入口開始,遍歷找到點所有相鄰的點,直到出口。因為圖可能會包含環,所以在迷宮中會出現兜圈子的情況,所以程序中記錄到每一個經過的點,如果再次遇到上,則返回上一個點。如果遇到出口,則退出整個旅程,返回到入口,途中記錄經過的每一個點,並最終寫出從入口到出口的路線。這不是最優化的辦法,得到的結果不一定是最短的路線,只要入口和出口之間是賦值的,就一定可以找到一條路線。


[javascript]
//試著走出迷宮並列印結果  
function walkOut(entry, exit){ 
    varvisited = [], path = [];      if (vertex === exit }) {//找到出口  
            path.push(vertex); 
           visited.indexOf(vertex) > -1) {//頂點被訪問過  
            return false; 
        return false; 
       (vertex);//記住每個頂點  
        varconnected = vertex.adjacent; 
        var length = connect.length        
            return false; 
        } 
        for ( var i = 0; i                           返回true; 
            } 
    
     
    function printPath(){ 
    varfootprint = ''; 
    var length = path.length; 
        footprint += path[i]. id; 
        足跡+= i === 0 ? '':'> '; 
    } 
    印刷(足跡); 

 
    if (walk(entry)) { 🠎  else { 
        print('出不去!'); 
    }

//試著走出迷宮並印製結果
function walkOut(entry, exit){
    varvisited = [], path = [];
   
  出口
            path.push(vertex);
            return true;
        ) {//頂點被造訪過
            return false;
        }
Visited.push(vertex);/ /記住每個頂點
        varconnected = vertex.adjacent;
        var length =connected.length;       var length =connected.length;         return false;
        }
        for (var i = 0 ; i                   return true;
            }
        }
    }
      }
   (){
    varfootprint = '';
    var length = path.length;
    for (var i = length - 1; i > -1; i--) {足跡+= i === 0 ? '':'> ';
    }
    print(足跡);
}

    if (walk(entry)) { 
        print('出不去! ');
    }
}我們可以試試看大概是程式碼走迷宮的能力。

[javascript]
function testMaze(){ 

    var g=Graph(); 

    g.addIds([1, 2, 3, 4, 5, 6]); g.connect(1, 3); 
    g.connect(1, 4); 
    g.connect(2, 3); 
   g.vertices[1], g.vertices[5]);//1 > 2> 3> 5  
    walkOut(g.vertices[1], g.vertices[6]);//出不!去  
    walkOut(g.vertices[2], g.vertices[5]);//2 > 1> 3> 5  

function testMaze(){
 [1, 2, 3, 4, 5, 6]);
 g.connect(1, 2);
 g .connect(1, 3);
 g.connect(1, 4);
 g.connect( 2, 3);
 g.connect(3, 5); //你可以畫出這張圖
 walkOut(g.vertices[1], g.vertices[5]);//1 > 2> 3> 5
 walkOut(g.vertices[1], g.vertices[6]);//出不去!
 walkOut(g.vertices[2], g.vertices[5]);//2 > 1> 3> 5
}在現實生活中,我們當然也可以用這種簡單的方法走出任何一個可能走出的迷宮,只要你用筆和便條紙在每個岔路口記下你選擇的路線。

 



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn