25C++函数(3)
一、递归算法
(第77课 交作业啦)
快下课了,狐狸老师想批改第1小组的作业,于是对坐1组1号的尼克同学说:“交作业啦!”,尼克转过去对第2位同学说:“交作业啦!”,第2位同学转过去对第3位同学说:“交作业啦!”····第6位同学转过去对第7位同学说:“交作业啦!”,第7位是格莱尔同学,她是1组最后一位同学,于是,她把自己的作业交给了第6位同学,第6位同学把收到的作业连同自己作业交给第5位同学···第2位同学把收到的作业连同自己作业交给第1位同学,第1位尼克同学把收到的作业连同自己作业交给狐狸老师,作
业终于收好了,如下图所示。

在C++里,也有类似的用法——递归算法。递归算法是一种“自己调用自己” “有去有回”的算法,它在调用一个函数的过程中又出现直接或间接的调用该函数本身,但调用的过程不是一个无休止的,而是有限次数的,总有一次是要终止调用的,一般用if语句来控制。
利用进归算法,试编一程序,算一算我收到多少本作业?
zuoye(1)=zuoye(2)+1
zuoye(2)=zuoye(3)+1
zuoye(3)=zuoye(4)+1
zuoye(4)=zuoye(5)+1
zuoye(5)=zuoye(6)+1
zuoye(6)=zuoye(7)+1
zuoye(7)=1
求解分两步,第1步是“递归前进”,第2步“递归返回”,如图所示。

#include <iostream>
using namespace std;
int zuoye(int n)
{
if(n==7)
return 1;
else
return zuoye(n+1)+1;
}
int main()
{
cout<<zuoye(1)<<endl;
return 0;
}
练习
(1)函数的递归调用是通过( )来实现的。
A.线性表 B.链表 C.队列 D.栈
2.阅读程序写结果。
#include <iostream>
using namespace std;
int fun(int n)
{
if(n==1)
return 0;
else
return fun(n-1)+2;
}
int main()
{
cout<<fun(10)<<endl;
return 0;
}
(3)完善程序。
尼克等四位同学在操场上打篮球,狐狸老师问大家各投中了几个球?排在第4位的格莱尔同学说她比第3位同学多投中了5个球;第3位同学比第2位同学多投中了5个球;第2位同学比第1位同学多投中了5个球;第1位尼克同学说:“我是初学者,一个球都未进。”老师说:“失败并不可怕,可怕的是失去信心,请继续努力!”请问格莱尔同学投中了几个球?
#include <iostream>
using namespace std;
int toulan(int n)
{
int t;
if(n!=1)
__________;
else
__________;
return t;
}
int main()
{
cout << toulan(4)<< endl;
return 0;
}
二、递归算法及子函数的声明
(第78课 通力合作的100个数)
利用通归算法,试编一程序,输出1~100的自然数。
让我光来模拟一下吧。
100说:要输出我100,那得先输出99。99说:要输出我99,那得先输出98。98说:要输出我98,那得先输出97。.....
2说:要输出我2,那得先输出1。1说:好的,我马上输出1。
接着,
1说:我输出1,接下来轮到2。2说:我输出2,接下来轮到3。3说:我输出3,接下来轮到4。.....
99说:我输出99,接下来轮到100。100说:我输出100,谢谢大家通力合作,大功告成!
#include <iostream>
#include <iomanip>
using namespace std;
int show(int n); //对子函数的声明
int main()
{
int n=100;
show(n);
return 0;
}
int show(int n)
{
if(n!=1) show(n-1);
cout<<setw(5)<<n;
}
由于被调用的自定义函数show()在调用它的主函数main()的后面,所以在主函数main()的前面,需要对函数show()先进行声明,否则就会发生错误。
练习
(1)已知队列中依次存在下列元素(88,79,65,10,100),若第一个出队列的元素是88,则第四个出队列的元素是( )
A.79 B.65 C.10 D.100
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int fun(int n);
int main()
{
cout << fun(fun(4));
return 0;
}
int fun(int n)
{
if(n==O||n==1)
return l;
else
return fun(n-1)+fun(n-2);
}
输出:______________
(3)完善程序。
输入一个自然数,输出它的倒序数,如输入123,输出321。
#include <iostream>
using namespace std;
int fun(int n);
int main()
{
int n;
cin>n;
_______;
return 0;
}
int fun(int n)
{
if(n<10)
cout <<n;
else
{
cout<<n%10;
_____________;
}
}
三、递归求最大值
(第79课 谁是老大)
输入5个整数,用递归算法求出最大值。

如,输入5个数:88 92 98 99 85


最大的数是:99
#include <iostream>
using namespace std;
int max(int a[],int n)
{
int t;
if(n==1)
t=a[1];
else
if(max(a,n-1)>a[n])
t=max(a,n-1);
else
t=a[n];
return t;
}
int main()
{
int a[6]; //为了便于理解,a[0]不用。
cout<<"请输入5个数:"<<endl;
for(int i=1;i<=5;++i)
cin>>a[i];
cout<<"最大的数是:"<<max(a,5)<<endl;
}
练习
(1)( )是微软公司发布的一种面向对象的、运行于.NET Framework上的高级程序设计语言。
A.Java B.C# C. Pascal D. Python
2.阅读程序写结果。
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
if(a==b)
return a;
else
if(a>b)
return ged(a-b, b);
else
return gcd(a,b-a);
}
int main()
{
int x, y, z;
cin>>x>>y>>z;
x=gcd(x,y);
x=gcd(x,z);
cout <<x<<endl;
return 0;
}
输入:36 6 18
输出:________
(3)完善程序。
输入2个自然数,输出它们的最大公约数。
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
if(b==0)
__________;
else
return gcd(b, a%b);
}
int main()
{
int a, b;
cout<<"a, b=";
cin>>a>>b;
cout<<"最大公约数:"<<_______<<endl;
return 0;
}

浙公网安备 33010602011771号