递归是程序直接或间接调用自身的过程。首先了解递归模型:一个递归模型由递归出口和递归体两部分组成,递归出口确定递归到何时为止,递归体确定递归的方式。
程序实例
①赶鸭子
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
分析
剩2只
7村 (2+1)*2=6
6村 (6+1)*2=14
5村 (14+1)*2=30
4村 (30+1)*2=62
3村 (62+1)*2=126
2村 (126+1)*2=254
1村 (254+1)*2=520
递归出口:经过了第七个村子后,剩两只鸭
递归体:2*(SellDuck(village+1)+1)
递归公式:
注意这里village==8是递归结束条件是因为这个人已经走过了7个村子,当village自增到8时说明已经走完了之前的7个村子。
程序实现
#include<iostream>
using namespace std;
//递归
int village = 7;
int SellDuck(int village)
{
if(village == 8)
{
return 2;
}
else
{
return 2 * (SellDuck(village+1) + 1 );
}
}
void PrintEachDuckNum()
{
cout<<"出发 "<<SellDuck(1)<<"只鸭"<<endl;
for(int i = 1;i < 8;i++)
{
cout<<i<<"村 卖出"<<SellDuck(i) / 2 + 1<<"只鸭 "<<endl;
}
cout<<"剩余 "<<SellDuck(8)<<"只鸭"<<endl;
}
int main(void)
{
int ducknum = SellDuck(7);
PrintEachDuckNum();
return 0;
}
运行结果
②角谷定理
输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
分析
递归出口:得到自然数1
递归体:
递归公式:
程序实现
#include<iostream>
using namespace std;
static int step;
//递归
void JGTheory(int num)
{
if(num==1)
{
cout<<num<<" ";
cout<<"\nSTEP="<<++step<<endl;
return ;
}
else if(!(num % 2))//如果是偶数
{
cout<<num<<" ";
step++;
JGTheory(num / 2);
}
else if(num % 2)//如果是奇数
{
cout<<num<<" ";
step++;
JGTheory(num * 3 +1);
}
}
int main(void)
{
int n ;
cin>>n;
JGTheory(n);
return 0;
}