更多例子
第二個遞歸的例子是求兩個自然數的最大公約數(有沒有回到令人懷念的中學時代)。下面的程序用的是經典的輾轉相除法。
[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){
var c = a % b;
if (c === 0)
return b;
else
return gcd(b, c);
}
除了上面這些條件或者解法可以轉化為數學的遞歸定義的計算,遞歸方法還適用於其所涉及的數據結構即是解法可以轉化為數學的遞歸定義的計算,遞歸方法還適用於其所涉及的數據結構即是以以遞歸形式定義的問題,例如鍊錶、圖、樹等等。
現在我們來看一個迷宮的例子。迷宮可以抽象化成數學上的圖,每個岔路口都是點,其間的路是邊。兩個特殊的點,分別被定義成入口和出口。
下面是用Javascript定義的點和圖。每個點包含一個id作為編號和標誌,相鄰的點被保存在一個陣列中。圖有一個添加點的方法,和一個更方便使用的直接添加點的id的方法;還有一個添加邊的方法。
[javascript]
//define a vertexfunction 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[exex.id]=vertexex;將它們加到圖表
函數addIds(ids){
var id;
for (var i=0; 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(){
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
}在現實生活中,我們當然也可以用這種簡單的方法走出任何一個可能走出的迷宮,只要你用筆和便條紙在每個岔路口記下你選擇的路線。