더 많은 예
두 번째 재귀적 예는 두 자연수의 최대 공약수를 찾는 것입니다(그리운 중학교 시절로 돌아간 적이 있습니까). 아래 프로그램은 고전적인 유클리드 나눗셈 방법을 사용합니다.
[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);
}
수학적 재귀 정의 계산으로 변환할 수 있는 위 조건이나 해법 외에도 재귀적 방법도 적용 가능합니다. 관련된 데이터에 대한 구조는 연결된 목록, 그래프, 트리 등과 같은 재귀 형식으로 정의된 문제입니다.
//정점 정의
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
그래프에
함수 addIds(ids){
var id
for (var i=0; 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
}
}
vertices[vertex.id]=vertex;
}
//ID에서 정점을 생성하여 그래프에 추가
함수 addIds( ids){
var id;
for (var i=0; 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
}지금은 现实生活中, 我们当然也可以用这种笨办法走任何一个可能走仫宫, 只要你用笔和便签纸에서 每一个岔路口记下你选择的路线。