欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数总结与心得

程序员文章站 2022-07-08 10:47:50
...

目录

一、函数相关重点知识

二、略整题型

三、个人学习心得


一、函数相关重点知识

 1.三种参数传递方式

    按值传递

要注意被调用函数本身不对实参进行操作!即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。而且此种传递方式美中不足为只能传递一个值。要想传递多个值需要借用以下两种方式。

   地址传递

按地址传递与按值传递的不同在于:形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
  引用传递

引用传递方式是在函数定义时在形参前面加上引用运算符&”:类型名 &引用名 = 某变量名。相当于一个变量有两个名字~

以上三种传递方式尤以引用传递最为方便自然,属上上之举。

2.*与&在不同情景下的不同作用

在函数定义中*表示指针说明符即所定义变量为指针变量。&表示用另外一个名字表示同一个变量。

若不在函数定义中*表示取内容,&则表示取地址。

此处附上两个代码既能看出*与&的不同功能还可比较后两种传递方式的不同

地址传递:

#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
    int a = 3, b = 4;
    cout << "a = " << a << ", b = "
    << b << endl;
    swap(&a,&b);
    cout << "a = " << a << ", b = "
    << b << endl;
    system("pause");
    return 0;
}
void swap(int *x,int *y)
{
     int t = *x;
     *x = *y;
     *y = t;
}
引用传递:

#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
    int a = 3, b = 4;
    cout << "a = " << a << ", b = "
    << b << endl;
    swap(a,b);
    cout << "a = " << a << ", b = "
    << b << endl;
    system("pause");
    return 0;
}
void swap(int &x,int &y)
{
     int t = x;
     x = y;
     y = t;
}

3.通过指针可以引用数组元素也可以输出数组的全部元素也可接受数组地址。

4.敲小黑板的重点:递归函数

¢直接或间接调用自身函数称为递归函数
¢它通常把一个大型复杂的问题层层转化为一个与原问题相似规模较小的问题来求解

递归的关键在于找出递归定义和递归终止条件。

递归算法解题通常有三个步骤:

1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。

2)设置边界、控制递归:找出停止条件,即算法可解的最小规模问题。

3)设计函数、确定参数:设计函数体中的操作及相关参数。

例:欧几里德算法

GCD(m,n) // 约定m>n //

  {   if (n==0) return(m);

      else return (GCD(n,m mod n));

  }

二.略整题型

1.描述

所谓水仙花数指一个三位数,其各位数字立方和等于该数本身。

输入

输出

100(包括100)到1000之内的数(不包括1000)

#include<bits/stdc++.h>
using namespace std;
int f()
{
    int a,b,c,i;
    for(i=100;i<1000;i++)
    {
        a=i/100;
        b=(i/10)%10;
        c=i%10;
        if(i==a*a*a+b*b*b+c*c*c)
        cout<<i<<" ";
    }
}
int main()
{
    f();
    return 0;
}

2.全排列问题

//产生从元素k~m的全排列,作为前k—1个元素的后缀
void Perm(int list[], int k, int m)
{
	//构成了一次全排列,输出结果
	if(k==m)
	{
		for(int i=0;i<=m;i++)
			cout<<list[i]<<" ";
		cout<<endl;
	}
	else
		//在数组list中,产生从元素k~m的全排列
		for(int j=k;j<=m;j++)
		{
			swap(list[k],list[j]);
			Perm(list,k+1,m);
			swap(list[k],list[j]);
		}
}

三.个人心得

    刚学习函数时没觉得特别难,做题的时候只不过是把以前在主函数里运行的一部分拿出来再给它定义一个函数然后放进去。说虽然不上得心应手但费些功夫总能写出来,而学了递归之后就不行了,一是抓不到要怎么用递归二是即使好不容易写出来了也还超时,这就让人很绝望了。但一切都得一点点去适应,有了第一次就会有第二次慢慢就熟悉了。对于函数自己也没有很多深刻的认识之类的,一些基本知识倒是掌握的差不多了。也只能说还得再接再厉吧。