C++学习(二十一)(C语言部分)之 函数2
复习
函数名 函数名称 调用时需要函数名加上相应的参数
函数类型 void 返回值(根据函数的需要)
参数
函数体 用来写函数的一个定义 函数怎样实现都现在其中
函数声明 函数定义 定义如果放在调用的后面,那么就要在前面进行函数的声明 如果定义放在调用的前面就不用进行声明了
形参 实参 函数定义时的参数是形参 实参是在函数调用的时候 函数传值
作用域
新内容
递归 函数自己或者间接调用自己(少量代码 描述一个重复计算)
有一些语言 内部用递归代替循环
缺点
没有设计好的话 会出现栈区溢出
递归有时效率不如循环高
1.移动n个盘子--->移动n-1个盘子 (复杂问题简单化)
2.(找到联系) 递归条件 --边界条件
1+2+3+4+5+...+n(n=100)
(1+2+3+...+n-1)+n
s(n) 函数 求前n项和(n是整数 并且大于0)
递归 1.和一些递归相关的数据结构(二叉树)
2.用递归实现一些算法 二分法查找 归并排序
3.用递归解决问题 汉诺塔 寻路
函数和指针
1.函数传参 实参类型和形参类型
实参 形参 定义方式
int x int x
&x int *p
int arr[5];//传递的是arr int parr[]//不要大小不要下标 或者 int*parr 一维数组对应一维指针
int darr[5][6]//darr int pdarr[][6]或者int(*pdarr)[6] 二维数组 对应数组指针
指针
int*pparr[10]//pparr int*pp[]或者int**pp//指针数组 对应的是二级指针
数组名(不是指针) 传参的时候会退化成指针
数组名 和指针不同点
数组名不能++
sizeoff(数组名)和sizeof(指针)结果是不一样的
sizeof(数组名)得到的是数组大小
sizeof(指针)得到的是指针的大小
指针是什么类型 取决于你如何定义 不是看你指向什么
int*p;//单独定义指针
//intarr[3][4][5][6][7][8];
int(*parr)[4][5][6][7][8];//换离arr最近的那一个
int arr[2];-->int(*parr)===int*parr;
int*pparr[10]//pparr(名) 指针数组 int*类型的元素 [10]表示数组
int(*pdarr)[10] (*pdarr)表明这个pdarr是指针 int[10] 指向数组的指针 数组指针 指向的是数组首地址
2.函数指针 指向函数的指针
定义和使用 传参(实参是函数名 形参怎么写)
找已有函数
回调函数 通过函数指针调用的函数
示例代码如下:
1 #include<stdio.h> 2 //汉诺塔游戏 3 //int s(int n)//数列求和 思路一 4 //{ 5 // int sum = 0; 6 // for (int i = 0; i < n; i++) 7 // { 8 // sum += i; 9 // } 10 // return sum; 11 //} 12 int step = 0;//全局变量 移动的次数 13 int s(int n)//s(n)的值 用s(n-1)代替s(n) 思路二 14 { 15 if (n > 1) 16 return s(n - 1) + n;//内部调用自己 17 else//当n==1 返回1 18 return 1; 19 } 20 21 void hano(int n, char a, char b, char c)//移动n个盘子 a-->c b 作为辅助 22 {//汉诺塔游戏 23 if (n <= 0) return; 24 else if (n == 1) 25 { 26 //直接移动 27 printf("把第%d移动到%c上\n", n, a, c); step++; 28 } 29 else//大于等于1 30 { 31 hano(n-1,a,c,b);//把上面n-1个盘子从a移动到b c辅助 32 printf("把第%d从%c移动到%c上\n", n, a, c); step++; 33 hano(n-1,b,a,c);//把上面n-1个盘子从b移动到c上 a辅助 34 } 35 36 } 37 //调用的时候不需要管内部实现 38 int main() 39 { 40 //int x = s(8); 41 //printf("%d",x); 42 //hano(7,'a','b','c');//调用函数 void hano 43 //printf("移动的次数是%d\n", step);//输出汉诺塔游戏的移动步骤次数 44 45 //调用s这个函数--》通过函数名+参数调用 46 //函数指针 通过指针找到函数位置 调用函数 47 //函数名换成(*p) 48 int(*ps)(int);//*ps表明指针 后面的(int)表明是函数(参数只有一个int)前面的int表示函数的返回值 49 //ps = &s; 50 ps = s;//赋值函数地址(可以加去地址) 赋值函数名(函数比较特殊) 51 printf("%d",ps(5));//调用函数 52 //void(*phano)(int n, char a, char b, char c);//没有赋值 不能直接使用 53 return 0; 54 }
附:
递归
2019-03-15 11:32:34
上一篇: C# Winform模仿百度日历
下一篇: 里氏转换