遞迴呼叫是一種特殊的巢狀呼叫,是某個函式呼叫自己或者是呼叫其他函式後再次呼叫自己的,只要函式之間互相呼叫能產生迴圈的則一定是遞迴呼叫,遞迴呼叫一種解決方案,一種是邏輯思想,將一個大工作分為逐漸減小的小工作,比如說一個和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然後考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了,遞迴是一種思想,只不過在程式中,就是依靠函式巢狀這個特性來實現了
遞迴舉例:
C語言中的遞迴
計算階乘的程式碼
long fact(long n)
{
if(n==0||n==1) return 1L;
else return n*fact(n-1);
}
這個函式叫做fact,它自己呼叫自己,這個就是一個典型的遞迴呼叫,呼叫過程類似一個棧。
注: 主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身。 每呼叫一次就進入新的一層。
int f (int x)
{
int y;
z=f(y);
return z;
} 這個函式是一個遞迴函式。 但是執行該函式將無休止地呼叫其自身,這當然是不正確的。為了防止遞迴呼叫無終止地進行, 必須在函式內有終止遞迴呼叫的手段。常用的辦法是加條件判斷, 滿足某種條件後就不再作遞迴呼叫,然後逐層返回。 下面舉例說明遞迴呼叫的執行過程。
注:連結串列在某種程度上就是遞迴的呼叫.
Pascal中的遞迴
const
z=10000;
var
a:array[0..z+1]of integer;
n,j,i,k:longint;
begin
readln(n);write(n,`!=`);
begin
a[1]:=1;
for i:=1 to n do
begin
for j:=1 to z do
a[j]:=a[j]*i;
for k:=1 to z do
begin
a[k+1]:=a[k+1]+a[k]div 10;
a[k]:=a[k]mod 10;
end;
end;
i:=z;k:=0;
repeat
if a[i]<>0 then k:=1;
i:=i-1;
until k=1;
k:=0;
for j:=i+1 downto 1 do
write(a[j]);
end;
writeln;
end.
c++語言中的遞迴
#include<iostream>
using namespace std;
int fac(int n)
{
int s=1;
for (int i=n;i>0;i–)
{
if (s<=s*i) s=s*i;
else
{
cout<<“over int area”<<endl;
return 0;
};
}
return s;
}
void main()
JAVA寫的遞迴呼叫
public class TestDg {
public static void main(String[] args) {
System.out.println(method(5));
}
public static int method(int n) {
if (n == 1)
return 1;
else
return n * method(n – 1);
}
}
漢諾塔——軟體遞迴呼叫裡面最經典的一個案例
#include<stdio.h>
int c=0; /* 全域性變數,搬動次數 */
void move(char x,int n,char z)
{ /* 第n個圓盤從塔座x搬到塔座z */
printf(“第%i步: 將%i號盤從%c移到%c
“,++c,n,x,z);
“,++c,n,x,z);
}
void hanoi(int n,char x,char y,char z)
{ /* 將塔座x上按直徑由小到大且自上而下編號為1至n的n個圓盤 */
/* 按規則搬到塔座z上。y可用作輔助塔座 */
if(n==1)
move(x,1,z); /* 將編號為1的圓盤從x移到z */
else
{
hanoi(n-1,x,z,y); /* 將x上編號為1至n-1的圓盤移到y,z作輔助塔 */
move(x,n,z); /* 將編號為n的圓盤從x移到z */
hanoi(n-1,y,x,z); /* 將y上編號為1至n-1的圓盤移到z,x作輔助塔 */
}
}
void main()
{
int n;
printf(“3個塔座為a、b、c,圓盤最初在a座,藉助b座移到c座。請輸入圓盤數:”);
scanf(“%d”,&n);
hanoi(n,`a`,`b`,`c`);
}
遞迴詳解
呼叫前
一個函式的執行期間呼叫另一個函式時,在執行被呼叫函式之前,系統需要完成3件事情:
(1)將所有的實參、返回地址等資訊傳遞給被呼叫函式儲存;
(2)為被呼叫函式的區域性變數分配儲存區;
(3)將控制轉移到被調函式的入口。
呼叫中
而從被呼叫函式返回撥用函式之前,系統也應完成3件工作:
(1)儲存被調函式的計算結果;
(2)釋放被調函式的資料區;
(3)依照被調函式儲存的返回地址將控制轉移到呼叫函式。當有多個函式構成巢狀時,按照後呼叫先返回的原則。
遞迴函式特點
所有遞迴函式的結構都是類似的。
(1)函式要直接或間接呼叫自身。
(2)要有遞迴終止條件檢查,即遞迴終止的條件被滿足後,則不再呼叫自身函式。
(3)如果不滿足遞迴終止的條件,則呼叫涉及遞迴呼叫的表示式。在呼叫函式自身時,有關終止條件的引數要發生變化,而且需向遞迴終止的方向變化。
總結
函式的呼叫原則和資料結構棧的實現是相一致。也說明函式呼叫是通過棧實現的。(注:此文章來自百度)