>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 재귀에 대한 추가 예

JavaScript의 재귀에 대한 추가 예

高洛峰
高洛峰원래의
2016-11-28 11:36:08967검색

더 많은 예

두 번째 재귀적 예는 두 자연수의 최대 공약수를 찾는 것입니다(그리운 중학교 시절로 돌아간 적이 있습니까). 아래 프로그램은 고전적인 유클리드 나눗셈 방법을 사용합니다.


[javascript]
//최대 공약수
//a와 b가 모두 양의 정수라고 가정
function gcd(a, b){
if (a < ; b) return gcd(b, a);//a >= b
var c = a % b
if (c === 0)
return b; else
          return gcd(b, c);

//최대 공약수

//a와 b가 모두 양의 정수라고 가정
function gcd(a, b) {
if (a < b) return gcd(b, a);//a >= b를 보장
var c = a % b;
if (c === 0)
return b;
else
return gcd(b, c);
}
수학적 재귀 정의 계산으로 변환할 수 있는 위 조건이나 해법 외에도 재귀적 방법도 적용 가능합니다. 관련된 데이터에 대한 구조는 연결된 목록, 그래프, 트리 등과 같은 재귀 형식으로 정의된 문제입니다.

이제 미로의 예를 살펴보겠습니다. 미로는 수학적 다이어그램으로 추상화될 수 있습니다. 도로의 각 분기점은 점이고, 그 사이의 도로는 가장자리입니다. 두 개의 특수 지점이 각각 입구와 출구로 정의됩니다.

다음은 Javascript로 정의된 점과 그래프입니다. 각 포인트에는 숫자와 레이블로 ID가 포함되어 있으며 인접한 포인트는 배열에 저장됩니다. 그래프에는 포인트를 추가하는 방법, 포인트 ID를 직접 추가하는 보다 편리한 방법, 엣지를 추가하는 방법이 있습니다.

[javascript]

//정점 정의
function Vertex(id){
var Stem={}
Stem.id=id
Stem.adjacent; =[];
줄기 반환
}
//그래프 정의
function Graph(){
var Stem={}, vertices={}> //추가 그래프에 꼭짓점
function add(vertex){
if (vertex instanceof Array){
for (var i=0, v=vertex; i 꼭짓점 [v[i].id]=v[i];
                                                                                                                                                그래프에
함수 addIds(ids){
var id
for (var i=0; i id=ids[i];
vertices[id]=Vertex(id) , v2=vertices[i2]
if (v1 && v2){
v1. 인접.push(v2);
v2.adjacent.push(v1);
}
}
줄기.vertices=vertices;
줄기.추가
addIds=addIds;
줄기.connect=connect;
줄기 반환
}

//정점 정의
function Vertex(id){
 var Stem={};
 stem.id=id;
 stem.adjacent=[];
 return 줄기 ;
}
//그래프 정의
function Graph(){
 var Stem={}, vertices={};
 //그래프에 정점 추가
 function add (정점){
  if (배열의 정점 인스턴스){
   for (var i=0, v=vertex; i    정점[v[i].id]= v[i];
   }
  }
  vertices[vertex.id]=vertex;
 }
 //ID에서 정점을 생성하여 그래프에 추가
 함수 addIds( ids){
  var id;
  for (var i=0; i   id=ids[i];
   vertices[id]=Vertex(id) ;
  } 
 }
 //두 정점 사이에 가장자리 생성
 function connect(i1, i2){
  var v1=vertices[i1], v2=vertices[i2];
  if (v1 && v2){
   v1.adjacent.push(v2);
   v2.adjacent.push(v1);
  }
 }
 stem.vertices=vertices;
 stem.add=add;
 stem.addIds=addIds;
 stem.connect=connect;
 return 줄기;
}我们走take迷宫的思路是从入口开始,遍历每个매우 유용합니다.到过的点,如果再次遇上,则返回上一个点。如果遇到到个,则退流整个遍历,返回到入口,途中记录经过的每个点,并最终写到到到个遍历,返回到入mouth, 这不是一个최고의 전략, 得到的结果未必是最短的路线,但是只要入口和入口之间是连communication,就一定可以找到一条路线。

[javascript]
//미로에서 빠져나와 결과를 인쇄해 보세요.  
함수 walkOut( 항목, 종료){ 
    var 방문 = [], 경로 = []; 
     
    function walk(vertex){ 
        if (vertex === exit) {//exit 찾기  
            path.push(vertex); 
            true를 반환합니다. 
        } 
        if (visited.indexOf(vertex) > -1) {//정점을 방문했습니다.  
            return false; 
        } 
        Visit.push(vertex);//각 꼭짓점 기억  
        var linked = vertex.adjacent; 
        var 길이 = 연결됨.길이; 
        if (length === 0) {//꼭지점이 격리됨  
            return false; 
        } 
        for (var i = 0; i < length; i++) { 
            if (walk(connected[i])) {//인접한 각 꼭짓점을 시도합니다.  
                path.push(vertex ); 
                true를 반환합니다. 
            } 
        } 
    } 
     
    function printPath(){ 
    varfootprint = ''; 
    var 길이 = 경로.길이; 
    for (var i = length - 1; i > -1; i--) { 
        공간 += path[i].id; 
        발자국 += i === 0 ? '' : ' > '; 
    } 
    print(발자국); 

 
    if (walk(entry)) { 
        printPath(); 
    } 
    else { 
        print('출불去!'); 
    } 

//미로에서 빠져나와 결과 인쇄
function walkOut(entry, exit){
    var Visited = [], path = [];
   
    function walk( vertex){
        if (vertex === exit) {//출구 찾기
           path.push(vertex);
            return true;
        }
        if (visited.indexOf(vertex ) > -1) {//정점을 방문했습니다
            return false;
        }
        Visited.push(vertex);//각 정점을 기억합니다
        var linked = vertex.adjacent;
        var length = linked.length;
        if (length === 0) {//정점은 격리됩니다
            return false;
        }
        for (var i = 0; i < length ; i++) {
           if (walk(connected[i])) {//인접한 각 정점 시도
              path.push(vertex);
               return true;
            }
        }
    }
 
    function printPath(){
    varfootprint = '';
    var length = path.length;
    for (var i = length - 1; i > -1; i--) {
        발자국 += path[i].id;
        발자국 += i === 0 ? '' : ' > ';
    }
    print(footprint);
}

    if (walk(entry)) {
        printPath();
    }
    else {
        print('出不去!');
    }
}我们可以试验一下这段代码走迷宫的能力。

[javascript]
function testMaze(){ 
    var g=Graph(); 
    g.addIds([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); //你可以画ude这个图  
    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  

function testMaze(){
 var g=Graph();
 g.addIds([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); //你可以画ude这个图
 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으로 문의하세요.