一、知识总结
1.函数定义
- 语法形式: 数据类型 函数名(形式参数表) { 函数体 //执行语句 }
- 函数调用 函数名(实参表); 实参可以是常量、变量,还可以是表达式,如果实参中存在变量,则在函数调用时,变量应该是“有确定值的”;
- 形实结合方式:1.把实参值赋值形参。2.形参在函数内部做一般变量使用。
#include<iostream> int f (int x) //函数定义,x为形参 { int y ; y = x * x + 2 * x + 1 ; return y ; } int main ( ) { int a ; a = 10 ; cout<<f(a); //函数调用, a为实参 return 0 ; }
2.函数参数的传递
- 传值参数:如果函数具有返回值,则在函数执行return语句时,系统将创建一个匿名对象临时存放函数的返回结果。这个匿名对象在返回调用之后撤销。
- 引用参数:类型名&引用名=某变量。 某个变量的引用,和这个变量是一回事,相当于该变量的一个别名。
引用的作用 :
void swap( int & a, int & b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1,n2) ; // n1,n2的值被交换
- 指针参数:指针变量:其内容为地址(存储位置)的变量,简称指针。它所指向的地址上存放的变量称作目标变量 指针变量定义的一般形式为:类型标识符 *变量名
- 3.递归函数
- 直接或间接调用自身的函数称为递归函数。
- 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
- 递归的关键在于找出递归定义和递归终止条件。
递归算法解题通常有三个步骤:
1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。
2)设置边界、控制递归:找出停止条件,即算法可解的最小规模问题。
3)设计函数、确定参数:设计函数体中的操作及相关参数。
例欧几里德算法
gcd ( m, n ) = gcd ( n, m % n )
递归代码:
GCD(m,n) // 约定m>n //
{ if (n==0) return(m);
else return (GCD(n,m mod n));
}
二、重点题型
例1.设计程序计算f (x) = x2 + 2x + 1,采用函数声明方式。
#include<iostream>
int Fun(int x) ;
int main( )
{
int a = 10, b;
b = Fun(a);
printf ("f(10)的值为:%d\n", b);
return 0 ;
}
int Fun(int x)
{
int y ;
y = x * x + 2 * x + 1 ;
return y ;
}
例2.
算法3.13计算半数集问题的递归算法—记忆式搜索
int a[1001];
int comp(int n)
{
int ans=1;
if(a[n]>0)return a[n];
for(inti=1;i<=n/2;i++)
ans+=comp(i);
a[n]=ans;
return ans;
}
三、心得体会
1.对于简单函数题型来说,一定要看清题目要求,找准形参与实参,函数调用的形式必须与函数定义的借口对应。
2.对于较难函数题型来说,一定要找准突破口。子程序的使用不仅可以缩短了程序,节省了内存空间及减少了程序的编译时间。一个复杂的问题总可以将其分解成若干个子问题来解决,如果子程序依然复杂,还可以将它继续分解知道每个子问题都是一个具有独立任务的模块。