递归

递归分为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"优化成一个地方。
}

  1. 首先调用了函数greet,并将参数name的值指定为mgggie
  2. 接下来函数greet调用了greet2,并将参数name的值指定为mgggie
  3. 此时函数greet处于未完成(刮起)状态
  4. 当前的函数调用为greet2
  5. 这个函数执行完后,函数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
posted @ 2020-03-09 16:11  花花妹子。  阅读(146)  评论(0编辑  收藏  举报