C++ 的函式具有遞回 ( Recursive ) 的特性,即程式本身可以再呼叫本身,這是一個相當有趣的特性,並且對某些運算特別有用,遞回程式可以寫的非常簡潔,但在執行時卻要使用較大的堆疊,並且也不能節省 memory 的使用空間,下面這個最簡單的遞回程式,即 func() 自己呼叫自己,所以程式就一直印出 “This is a endless program”。

#include <iostream.h>

void main()
{
     void func();                             //宣告
     func();                                  //呼叫
}

void func()                                   //定義
{
     cout << "This is a endless program\n";
     function();                              //func() 呼叫自己
}

執行結果:

This is a endless program
This is a endless program
This is a endless program
This is a endless program
This is a endless program
This is a endless pr^C              ←要按 Crtl+C 才停止

如果不按 Ctrl+C 讓程式一直執行下去,幾分鐘后電腦便會當機。 這是因為程式呼叫函式的層數太深,使得堆疊的容量不夠所導致的結果,我們也可以用組合語言的觀點來看遞回程式,每呼叫一次函式時,程式會把返回的位址及一些變數值擺到堆疊,所以 STACK 的深度一直增加,到最後堆疊因 overflow 而當機,於是再如何按鍵盤也回不來了。 故此,在遞回程式中,必須設定一個條件來控制呼叫的層數,而非隨心所欲地呼叫,如以下的範例:

範例一:Recursive 的次方函式

#include <iostream.h>

void main()
{
     int  x=3, y=12;
     long result, power(int ,int );

     result=power(x, y);
     cout << x << "^" << y << " = " << result;
}

long power(int x, int y)                         //遞回式的函式
{
     if(y == 1)                                  //在 y==1 時停止往下遞回
        return( (long) x );
     else
        return( x * power(x, y-1) );             //呼叫自己
}

執行結果:

3^12 = 531441

範例二:Recursive 的階乘函式

#include <iostream.h>

void main()
{
     int  x;
     long result, fact(int n);

     while(1)
     {
           cout << "Input an integer number:";
           cin  >> x;
           if(x<1)
              break;
           result=fact(x);
           cout << x << "! = " << result << endl; 
     }
}

long fact(int n)                                  //遞回函式
{
     if(n == 0)                                   //在 n==0 時停止往下遞回
        return (1L);                              //傳回 long 型別
     else
        return ( n * fact(n-1));                  //呼叫自己
}

執行結果:

Input an integer number:2
2! = 2
Input an integer number:3
3! = 6
Input an integer number:5
5! = 120
Input an integer number:0