递归
递归分为2部分
- 基线条件:函数不在调用自己(返回的条件)
- 递归条件:函数自己调用自己
数据结构:
- 堆
- 经过排序的树型数据结构
- 手动分配内存
- 栈
- 后进先出
- 🈶️系统自动分配
- 两种操作:压入和弹出
堆和栈的区别可以引用一位前辈的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。
//main.cpp int a = 0; //全局初始化区 int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c = 0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }
- 首先调用了函数greet,并将参数name的值指定为mgggie
- 接下来函数greet调用了greet2,并将参数name的值指定为mgggie
- 此时函数greet处于未完成(刮起)状态
- 当前的函数调用为greet2
- 这个函数执行完后,函数greet将接着执行
递归调用栈
<?php /** * Created by PhpStorm. * User: huahua * Date: 2020/3/9 * Time: 下午2:25 */ class Test { //顺序打印 public function call() { echo PHP_EOL; static $i = 0; echo $i; $i++; if ($i < 10) { $this->call(); } } //递归求和 public function recursionSum($n) { echo $n . "===" . PHP_EOL; if ($n > 1) { $s = $this->recursionSum($n - 1) + $n;//调用自身,sum(100)=sum(99)+100;以此类推往下递归! echo $n . "===" . $s . PHP_EOL; } else { $s = 1; echo '----' . PHP_EOL; } return $s; } //阶乘 public function fact($x){ if ($x == 1){ return 1; }else{ return $x*$this->fact($x - 1); } } } $test = new Test(); //$test->call(); //echo $test->recursionSum(100); echo $test->fact(3);
递归执行过程:
参考资料
堆和栈的区别(博客园): http://www.cnblogs.com/jiahuafu/p/8575044.html 关于堆栈的讲解(我见过的最经典的): https://blog.csdn.net/yingms/article/details/53188974 堆栈的工作原理: https://blog.csdn.net/laoqiuge/article/details/53728179