复习

函数名 函数名称 调用时需要函数名加上相应的参数
函数类型 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.函数指针 指向函数的指针
    定义和使用 传参(实参是函数名 形参怎么写)

找已有函数

回调函数 通过函数指针调用的函数

示例代码如下:

 #include<stdio.h>
//汉诺塔游戏
//int S(int n)//数列求和 思路一
//{
// int sum = 0;
// for (int i = 0; i < n; i++)
// {
// sum += i;
// }
// return sum;
//}
int step = ;//全局变量 移动的次数
int S(int n)//S(n)的值 用S(n-1)代替S(n) 思路二
{
if (n > )
return S(n - ) + n;//内部调用自己
else//当n==1 返回1
return ;
} void hano(int n, char A, char B, char C)//移动n个盘子 A-->C B 作为辅助
{//汉诺塔游戏
if (n <= ) return;
else if (n == )
{
//直接移动
printf("把第%d移动到%c上\n", n, A, C); step++;
}
else//大于等于1
{
hano(n-,A,C,B);//把上面n-1个盘子从A移动到B C辅助
printf("把第%d从%c移动到%c上\n", n, A, C); step++;
hano(n-,B,A,C);//把上面n-1个盘子从B移动到C上 A辅助
} }
//调用的时候不需要管内部实现
int main()
{
//int x = S(8);
//printf("%d",x);
//hano(7,'A','B','C');//调用函数 void hano
//printf("移动的次数是%d\n", step);//输出汉诺塔游戏的移动步骤次数 //调用s这个函数--》通过函数名+参数调用
//函数指针 通过指针找到函数位置 调用函数
//函数名换成(*p)
int(*ps)(int);//*ps表明指针 后面的(int)表明是函数(参数只有一个int)前面的int表示函数的返回值
//ps = &S;
ps = S;//赋值函数地址(可以加去地址) 赋值函数名(函数比较特殊)
printf("%d",ps());//调用函数
//void(*pHano)(int n, char A, char B, char C);//没有赋值 不能直接使用
return ;
}

附:

递归

2019-03-15  11:32:34

C++学习(二十一)(C语言部分)之 函数2的更多相关文章

  1. Python3.5 学习二十一

    本节内容概要: 上节回顾及补充知识点: 一.请求周期: URL->路由->函数或类->返回字符串或者模板 Form表单提交: 提交->url-函数或者类中的方法 -....(执 ...

  2. Scala学习二十一——隐式转换和隐式参数

    一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...

  3. Flutter学习二之Dart语言介绍

    上次我记录了Flutter的环境搭建,这次来简单记录一下Drat语言,Flutter是 Google推出并开源的移动应用开发框架,开发语言是Dart,那么Dart语言和其他的语言在语法上有上面区别呢, ...

  4. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  5. Salesforce LWC学习(二十一) Error浅谈

    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_error https:/ ...

  6. ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法

    1.数据准备 首先创建book索引 PUT /book/ { "settings": { "number_of_shards": 1, "number ...

  7. Java开发学习(二十一)----Spring事务简介与事务角色解析

    一.Spring事务简介 1.1 相关概念介绍 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 数据层有事务我们可以理解 ...

  8. cocos2d-x的初步学习二十一之iosandroid跨平台环境配置

    这篇文章中,我们将来构建下跨平台开发的环境配置,我自己也是参考了别人了文章,折腾了几个小时,尤其是android的配置相对麻烦些.... 参考自子龙山人:http://www.cnblogs.com/ ...

  9. ballerina 学习二十一 http2

    ballerina 支持http2 协议,包含server push http2 协议 参考代码 import ballerina/http; import ballerina/log;endpoin ...

  10. Linux系统学习 二十一、SAMBA服务—相关文件、配置文件详解

    3.相关文件 常用文件: /etc/samba/smb.conf      #配置文件 /etc/samba/lmhosts        #对应NetBIOS名与主机的IP的文件,一般Samba会自 ...

随机推荐

  1. day03_python_1124

    01 昨日内容回顾 while 条件: 循环体 如何终止循环: 1,改变条件. 2,break. 3,exit() quit() 不推荐. 关键字: break continue while else ...

  2. .NetCore发布到Centos docker

    将.netcore mvc项目发布到centos7的docker中.环境 vmware14+Centos7+docker-ce 1.使用vs将.netcoremvc项目发布到本地,修改发布后的目录 名 ...

  3. SmartGit(我工作中使用git图形化界面工具)

    http://www.syntevo.com/smartgit/ 这个工具用了快两年,之前在逸橙工作时同事(目前就职百姓网)推荐使用的,查看更改了哪些文档很方便,前天试用版过期,现在贴个 破解的链接 ...

  4. Linux运维工程师需要掌握什么才能胜任工作呢

    万丈高楼平地起,所有一切的高深的技术都离不开最基本的技术,那么作为运维工程师的你,什么是最基本的技术呢,毫无疑问是Linux,Linux 是你所有一切技术的根源,试想一下如果你连基础的操作命令都不知道 ...

  5. django 中下载文件与下载保存为excel

    一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...

  6. jenkins+findbugs+checkstyle+PMD静态代码检查(二)

    可以根据自己的需求选中对应的插件进行配置(不一定非要同时配置三个插件) jenkins:持续集成的工具 fundbugs:检测代码静态错误的插件  例如:定义了没有用到的对象,string类型的比较使 ...

  7. 红黑树( Red-Black Tree ) - 笔记

    1.  红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性  ...

  8. debian系统下安装ssh

    SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中 ...

  9. Linux如何从零开始搭建rsync+serync服务器(centOS6)

    一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除 ...

  10. Java基础-变量常量

    变量 内存中的一小块区域,需要变量名来访问 变量的命名: 变量类型 变量名=变量值 例:String stuName= "wangwei"; java中的所有标点符号都是英文的 变 ...