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;
}
posted @ 2025-06-19 17:04  gdyyx  阅读(32)  评论(0)    收藏  举报