天天看點

C++遞歸

在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸(recursive)調用。C++允許函數的遞歸調用,例如:

int f(int x)
{
  int y, z;
  z = f(y); //在調用函數f的過程中,又要調用f函數
  return (2 * z);
}      

下面舉兩個例子

1 【例4.10】有5個人坐在一起,問第5個人多少歲?他說比第4個人大兩歲。問第4個人歲數,他說比第3個人大兩歲。問第3個人,又說比第2個人大兩歲。問第2個人,說比第1個人大兩歲。最後問第1個人,他說是10歲。請問第5個人多大?

#include <iostream>
using namespace std;
int age(int);//函數聲明
int main( )//主函數
{
    cout<<age(5)<<endl;
    return 0;
}
int age(int n)//求年齡的遞歸函數
{
    int c; //用c作為存放年齡的變量
    if(n==1)
    {
        c=10;  //當n=1時,年齡為10
    } 
    else 
    {
        c=age(n-1)+2;  //當n>1時,此人年齡是他前一個人的年齡加2
    }
    return c; //将年齡值帶回主函數
}      
#include <iostream>
using namespace std;
long fac(int);//函數聲明
int main( )
{
    int n;//n為需要求階乘的整數
    long y;  //y為存放n!的變量
    cout<<"please input an integer :";  //輸入的提示
    cin>>n;  //輸入n
    y=fac(n);//調用fac函數以求n!
    cout<<n<<"!="<<y<<endl; //輸出n!的值
    return 0;
}

long fac(int n)  //遞歸函數
{
    long f;
    if(n<0)
    {
        cout<<"n<0,data error!"<<endl; //如果輸入負數,報錯并以-1作為傳回值
        f=-1;
    }
    else if(n==0||n==1)
    {
        return 1;//0!和1!的值為1
    }    
    else 
    {
        f=fac(n-1)*n;//n>1時,進行遞歸調用        
    }
    return f;//将f的值作為函數值傳回
}