函数章节总结

经过一段时间的学习与联系,我对于C++中的函数,指针函数,递归算法有了初步了解。
在函数的练习中需了解函数的概念,如怎样定义函数,函数的形式等许多注意的东西。函数有几种形式。
1.无参函数:无参函数即为没有参数传递的函数,无参函数一般不需要带回函数值,所以函数类型说明为void。
2.有参函数:有参函数即为有参数传递的函数,一般需要带回函数值。如:int max(int x,int y)函数。
3.空函数:即为函数体只有一堆花括号,花括号内没有任何语句的函数。
在做有关于函数的练习题时,我经常再返回值处出错,或忘记返回值的书写。在调用函数的时候常在主函数中就已经输入函数导致运行出错。在全局变量与局部变量的使用会混淆,如在求公约数时int x,y写在了主函数内使全局变量变为局部变量,且在调用函数中再次定义变量导致在构建时出现shadow错误。在练习中还出现不知怎么正确使用无参函数,多以int定义函数。
目前还是习惯于只用一个主函数做题,用函数的方法还是不熟练,或用一个函数的思想有时就会一时绕不过弯,不知但怎么编写函数中的内容。
而在指针函数的学习中,需要明确了解 int *p  int &x=y p=&x y=*p 的意思,才能正确编写程序。但目前只会简单的指针赋值,数据一多或赋值数组时就不能很好的运用。
如在int p=&a[1];常常忘记for语句循环或者赋值数组后不知道怎么用这个数组。且*P赋值的为整形数有时会忘记而赋值小数。在取地址时会出现混乱如已pa=&a在下面的编写又出现pb=&a。
递归算法对于我来说很难学,在函数的基础上运用递归,我对于此算法的了解还是很片面。
在递归算法中也出现了一些新的算法如return n==a?b:函数,含义为如果a为真,则表达式为值为b,否则为此前函数中算出的值。
例题:1.求分解因数
#include<bits/stdc++.h>using namespace std;
int shu(int a,int b) 
{
    int sum=0;
    if(a==1)
        return 1;
    for(int i=b; i<=a; i++)
    if(a%i==0)
    {
            sum+=shu(a/i,i);
        }
return sum;}
int main()
{
    int n,a;
    cin>>n;
    for(int i=0; i<n; i++)
    {
       cin>>a;
        cout<<shu(a,2)<<endl;
    }
return 0;}
需要注意在调用函数中每一种情况的返回值以及函数中求因数的算法,在for循环中从0开始而不是1,且因数需从2开始计算。
目前还不是很理解系统堆栈,递归边界,全局变量或局部变量在函数中的传递。


2.验证歌德巴赫猜想
#include<bits/stdc++.h>
using namespace std;
int prime(int x)
{
    int i,n;
    n=sqrt(x);
    for(i=2;i<=n;i++)
    {
    if(x%i==0)
    return 0;
    }
    return 1;


}
int main()
{
    int n,n1,n2;
    cin>>n;
    for(n1=2;n1<=n/2;n1++)
    { n2=n-n1;
    if(prime(n1))
    if(prime(n2))
    cout<<n<<" "<<"="<<" "<<n1<<" "<<"+"<<" "<<n2<<" "<<endl;}
    return 0;
}
需要注意调用函数中对于素数的判断,以及在循环中i=2,在主函数的for循环中n1也是从2开始且n1小于等于n/2。

3.放苹果

#include<bits/stdc++.h>
using namespace std;
int count(int m,int n)
{
   if(n==1||m==0)  
   return 1;
   if(m<n) 
   return count(m,m);
   else 
   return count(m,n-1)+count(m-n,n);
}
int main()
{
 int i;
 cin>>i;
 for(;i>0;i--)
 {
  int a,b;
  cin>>a>>b;
  cout<<count(a,b)<<endl;
 }
 return 0;
}
需要看成是两种情况,第一种盘子不空,即每个盘子至少放一个苹果
第二种是盘子有空的,即至少有一个盘子是空的
转换成公式的话:m个苹果,n个盘子
第一种:m-n个苹果 n个盘子
第二种:m个苹果 n-1个盘子(这里苹果还没有进行存放就先不剪掉,只是处理掉至少一个盘子不放)

 
心得:通过本章的学习,我学会了如何构建一个实现某种功能的函数来实现自己想达到的目的。也可以自己进行这类用途函数的模拟。通过Openjudge上函数部分的学习,从而掌握本章的知识。一个正确的函数总是会有以下几部分组成:
1. 一个类型名:
用于指定函数的返回值的类型。
2. 一个函数名:
其名字由我们规定。一般来说,我们根据函数需要完成的功能来对其命名
3. 一个用括号( )包含的参数表:
参数的个数由我们根据题目需要来决定,甚至还可以不使用函数。
4. 一个用花括号 { } 包围的函数体:

函数体里面的代码则是函数完成特定功能的整个执行过程。如果在函数定义时将形参说明成指针,调用函数时就需要指定地址值形式的实参。这时的参数传递方式就是按地址传递方式。

在编写函数时一般先在主函数之前声明自定义的函数,如果声明后不直接写出自定义函数的代码,就要在自定义函数后面加分号,如果声明自定义函数后紧接着写代码,就不用加分号。一般自定义函数的代码都放到主函数后面自定义函数中的变量可以和主函数中的重复。如果在自定义函数中想返回某值,return只能返回一个值,可以在自定义函数中输出,然后在主函数中直接调用函数,例如JS在自定义函数中输出多个值,在主函数中写JS(a);这个语句就可以做到,而return只能返回一个值。

而递归函数它有一个基本部分,还有一个递归部分,即通过改变基本参数数,来逐步使n满足基本部分的条件,从而输出。在运行的过程中,它将整体分割成部分,并总是从最小的部分开始入手,当整体递归到部分时,会保留整体的信息,部分满足条件输出的结果会被回溯给整体使用,从而使得整体输出结果。每一步操作,整体都会将部分当作其中一个步骤,从而实现整体步骤的完成。
对于C++的学习只能循循渐进,慢慢理解。。。

猜你喜欢

转载自blog.csdn.net/fred_tt/article/details/79655562