你老师肯定给你说过:递归就是自己调自己
这种说法没毛病 但就是不负责任!!
递归分为两种:
- void型 :
你要关注这个函数的具体实现才能看懂这个函数具体的用处并不需要去关注函数的名字(有人会问我为什么要关注函数的名字)名字是一个函数的重要信息代表了函数可以干什么。但是void函数的名字就没那么重要了重要的是函数体:(一遍又一遍循环的函数体)调用我这个函数还没结束 打住!再调用一遍给你个参数继续给我干! - 非void型 :
名字!! 给你个参数你给我一个返回值 这是这个函数最最纯粹的想法,从宏观上是这样想的,但是上升到微观上 还是要看函数体 但是记住 函数的最纯粹的想法(给你个参数,你给我个返回值!!)是不能改变的!这是在编程中不会写递归的主要原因,找不到头绪!
本质:
- 1.我给你个东西 你给我个返回值或者不给我返回值
- 2.这是个东西 你给我个返回值或者你给我干事情(两种理解不同问题不同理解惠更简单更舒服)
但是如果你想改变我,怎么办 在c中就可以用指针!(个人觉得指针是最伟大的!)(其他语言我就不知道怎么搞了,这个学期刚讲完c++ Java,学的还不是特别好)继续说函数 给你个东西()就可以改变我 ?那就给你 !我的地址!
干说不爽 举个例子 在main函数中有个 struct TreeNode * head=null; 你想给你个头结点你给我整个排序树,你传head 把 只是把null给了他,所以就要传&head
(突然想起我们c++老师说的话 当时我听着觉得这老师是个loser ,但是现在回想起来觉得她对 引用理解的比我深)话是这样说的:引用可以当形参列表:这时候参数传递的就是这个值本身! (值本身)(有的nb诶) 但是如果只是普通形参列表 参数传递就是(值)(她已经将理解转化为自己的理解了,可以啊这老师,我错怪她了,可惜已经结课了,不知道还错过了什么她自己好的理解 难受) 她说的是一种理解方法;
真的诶 这样去想 真的好轻松, 我以前都要绞尽脑汁去想 地址?地址的地址?传递的是他的副本,不是他
那指针也可以这样去思考但是 重回我的思路:传递的是地址的话,如果你想访问我的值,那就*name 如果是地址的地址 那就**name(name是你的形参,name只是给传递的地址起个名字,要不你咋认他呢,人总要有个记号的要不(遗忘和被遗忘)才是最可怕的)
什么时候用递归
- 结构体的定义是递归定义的:
- 函数的调用的逻辑关系是递归的(而且每次调用函数都会使工程量减少):
以上就是对函数的小小的总结希望对你理解函数 学会递归,看代码方便有用!加油!
推荐阅读
- 算法|递归和非递归详解
- 【C】系列|【C语言】卍字通晓→函数+递归
- leetcode|LeetCode226翻转二叉树(递归)
- NOJ|NOJ 1227: 拆数
- leetcode做题笔记|leetcode:Subsets
- 算法学习笔记|【算法学习笔记】14.暴力求解法03 回溯法01 N皇后和素数环
- 算法学习笔记|【算法学习笔记】19.算法设计初步 最大子列和问题的三种方法
- 算法学习笔记|【算法学习笔记】20.算法设计初步 归并排序 求逆序数