search
Homephp教程php手册对函数及递归的通俗理解
对函数及递归的通俗理解Jun 13, 2016 am 10:55 AM
functionCanBaserightCompareunderstandofoutputreturnrecursiondifficult

没有基础的兄弟可能对函数的递归比较难以理解,特别是递归里返回输出的概念理不清,是如何返回的。

下面是课本上的列子,就拿出来,用我的理解来做解释。希望能帮到对这块还没弄懂的兄弟。

    function test($n){

        echo $n."nbsp";        

        if($n>0){

            test($n-1);//调用函数本身。

        }else{

            echo "";

        }

        echo $n."$nbsp";

    }

    test(3);//调用函数输出。

?>

得到结果是 3  2  1  0     0  1  2  3

大家比较容易理解的是前面输出的3  2  1  0  但对于后面的 0  1  2   3 为什么输出不是很清楚。

要理解这个递归的回归输出先要弄清楚,什么是函数,

 

官方解释:

         函数(function)是一段完成指定任务的已命名代码块。

使用函数的理由中有一条是:

         可提高程序的重用性

重用性就是可以重复使用,不多次编写相同代码。 就是将程序中重复编写的代码写成函数,然后在其他多处需要使用时只用调用函数名就可使用,而不用再次重复编写相同代码。

通俗简单点讲,函数就是一段已经写好的代码一把已经造好的枪,然后将它放在了公共仓库里,

不同功能的函数都有自己的名字【function 函数名(){}】,如同不同功能的枪也有自己的名字,如来福枪,狙击枪,手枪等,这些取好名的函数和枪都已经编写好,造好,放在仓库。

然后有谁想使用某个功能的函数时,到这个仓库里喊这个函数的名字【函数名()】,就将函数拿了出来使用,如同警察依据任务的不同要求到仓库里拿不同功能的枪一样。

————这就是函数的定义。

函数的使用:

                官方的叫法就是:调用   如  aaa();

               通俗的理解就是:那个谁谁谁(叫函数的名字)过来这里,把交给你的代码给我在这个位置写一遍。

我的理解是,就是是替换,函数的调用就是一个占位符,遇到了这个占位符【aaa()】就替换成这个占位符【aaa()】指定的已经写好的函数里的代码。遇到就替换,然后程序继续按先后的顺序往下执行。

具体例子说明:

/*=============装函数(手枪)的仓库=======================*/

function test($n){

        echo $n."nbsp";        

        if($n>0){

            test($n-1);//调用函数本身。

        }else{

            echo "";

        }

        echo $n."$nbsp";

    }

 

/*=============装函数(手枪)的仓库======================*/

 

test(3);     //调用函数,按我的想的就是遇到了占位符了,要替换名字叫test的那个函数里的代码,(你也可以理解成到仓库里拿叫test的枪装入3发子弹)

于是test(3)第一次遇到变成了

/***********************第一次调用时替换************************/

  echo $n."nbsp";        //这个时候$n=3  子弹是三发

        if($n>0){          //判断$n为3大于0 , 执行下边的

            test($n-1);     //再次遇到调用函数,遇到就替换,(子弹打出去一发)

        }else{

            echo "";  //不执行

        }

        echo $n."$nbsp"; //  这个时候$n=3,所以输出3

/***********************第一次调用时替换************************/

/***********************第二次调用时替换************************/

echo $n."nbsp";        //这个时候$n=3  子弹是三发

            if($n>0){          //判断$n>3 执行下边的

                 echo $n."nbsp";        //这个时候$n=2  子弹是二发

                           if($n>0){          //判断$n为2大于0, 执行下边的                                   

                               test($n-1);     //再次遇到调用函数,遇到就替换,(子弹再打出去一发)

                           }else{

                                 echo "";  //不执行

                           }

                                echo $n."$nbsp";//这个时候$n=2,所以输出2

        }else{

            echo "";  //不执行

        }

        echo $n."$nbsp";  //这个时候$n=3,所以输出3

/***********************第二次调用时替换************************/

/***********************第三次调用时替换************************/

echo $n."nbsp";        //这个时候$n=3  子弹是三发

            if($n>0){          //判断$n>3 执行下边的

                 echo $n."nbsp";        //这个时候$n=2  子弹是二发

                           if($n>0){          //判断$n为2大于0, 执行下边的                          

                                  echo $n."nbsp";        //这个时候$n=1  子弹是一发

                                   if($n>0){          //判断$n为1 大于0, 执行下边的

                                          test($n-1);     //再次遇到调用函数,遇到就替换,(子弹打出去一发)

                                   }else{

                                          echo "";  //不执行

                                 }

                                     echo $n."$nbsp"; //  这个时候$n=1,所以输出1                        

                           }else{

                                 echo "";  //不执行

                           }

                                echo $n."$nbsp";//这个时候$n=2,所以输出2

        }else{

            echo "";  //不执行

        }

        echo $n."$nbsp";  //这个时候$n=3,所以输出3

/***********************第三次调用时替换************************/

/***********************第四次调用时替换************************/

echo $n."nbsp";        //这个时候$n=3  子弹是三发

            if($n>0){          //判断$n>3 执行下边的

                 echo $n."nbsp";        //这个时候$n=2  子弹是二发

                           if($n>0){          //判断$n为2大于0, 执行下边的                          

                                  echo $n."nbsp";        //这个时候$n=1  子弹是一发

                                   if($n>0){          //判断$n为1 大于0, 执行下边的

                                          

                                        echo $n."nbsp";        //这个时候$n=0  子弹是0发

                                             if($n>0){          //判断$n为0等于0 ,不执行下边的

                                                     test($n-1);     //因为不执行所以就不替换了。

                                            }else{

                                                    echo "";  //输出

                                           }

                                    echo $n."$nbsp"; //  这个时候$n=0,所以输出0

                                  }else{

                                          echo "";  //不执行

                                 }

                                     echo $n."$nbsp"; //  这个时候$n=1,所以输出1                         

                           }else{

                                 echo "";  //不执行

                           }

                                echo $n."$nbsp";//这个时候$n=2,所以输出2

        }else{

            echo "";  //不执行

        }

        echo $n."$nbsp";  //这个时候$n=3,所以输出3

/***********************第四次调用时替换************************/

/*##################最终得到只有if判断语句和基础表达式组成的代码###########################*/

    test(3);//在最开始的时候只调用一次替换;

    //$n=3

    echo $n."nbsp";//输出3    

        if($n>0){

        //test(3-1)替成了下面的

                echo $n."nbsp";//输出2

                if($n>0){

                //test(2-1)替成了下面的

                        echo $n."nbsp";//输出1                    

                        if($n>0){

                                    //test(1-1)替成了下面的

                                    echo $n."nbsp";//输出0    

                                    if($n>0){//判断执行

                                    //test()没有替换

                                        test($n-1);//不执行 因为不大约0

                                    }else{

                                        echo "";//输出

                                    }

                                    echo $n."$nbsp";//输出0

                        }else{

                            echo "";//不执行

                        }

                        echo $n."$nbsp";//输出1

                }else{

                    echo "";//不执行

                }

                echo $n."$nbsp";//输出2

        }else{

            echo "";////不执行

        }

        echo $n."$nbsp";//输出3    

/*##################最终得到###########################*/

按照最终得到的代码依次输出的结果就是

输出结果就是 3 2  1 0 0 1  2  3

函数和递归的使用,最终就是解析成上面的代码执行的,

这就是我理解的函数,以及递归,用一句话说:“本来江湖上是没有递归的,出现的函数多了,也就有了递归。”

一点简单的理解,希望能帮助没有基础的兄弟理解函数,理解递归,最终形成自己的理解自己的想法和思路

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
广联达软件电脑配置推荐;广联达软件对电脑的配置要求广联达软件电脑配置推荐;广联达软件对电脑的配置要求Jan 01, 2024 pm 12:52 PM

广联达软件是一家专注于建筑信息化领域的软件公司,其产品被广泛应用于建筑设计、施工、运营等各个环节。由于广联达软件功能复杂、数据量大,对电脑的配置要求较高。本文将从多个方面详细阐述广联达软件的电脑配置推荐,以帮助读者选择适合的电脑配置处理器广联达软件在进行建筑设计、模拟等操作时,需要进行大量的数据计算和处理,因此对处理器的要求较高。推荐选择多核心、高主频的处理器,如英特尔i7系列或AMDRyzen系列。这些处理器具有较强的计算能力和多线程处理能力,能够更好地满足广联达软件的需求。内存内存是影响计算

提高 Python 代码可读性的五个基本技巧提高 Python 代码可读性的五个基本技巧Apr 12, 2023 pm 08:58 PM

Python 中有许多方法可以帮助我们理解代码的内部工作原理,良好的编程习惯,可以使我们的工作事半功倍!例如,我们最终可能会得到看起来很像下图中的代码。虽然不是最糟糕的,但是,我们需要扩展一些事情,例如:load_las_file 函数中的 f 和 d 代表什么?为什么我们要在 clay 函数中检查结果?这些函数需要什么类型?Floats? DataFrames?在本文中,我们将着重讨论如何通过文档、提示输入和正确的变量名称来提高应用程序/脚本的可读性的五个基本技巧。1. Comments我们可

CRPS:贝叶斯机器学习模型的评分函数CRPS:贝叶斯机器学习模型的评分函数Apr 12, 2023 am 11:07 AM

连续分级概率评分(Continuous Ranked Probability Score, CRPS)或“连续概率排位分数”是一个函数或统计量,可以将分布预测与真实值进行比较。机器学习工作流程的一个重要部分是模型评估。这个过程本身可以被认为是常识:将数据分成训练集和测试集,在训练集上训练模型,并使用评分函数评估其在测试集上的性能。评分函数(或度量)是将真实值及其预测映射到一个单一且可比较的值 [1]。例如,对于连续预测可以使用 RMSE、MAE、MAPE 或 R 平方等评分函数。如果预测不是逐点

详解JavaScript函数如何实现可变参数?(总结分享)详解JavaScript函数如何实现可变参数?(总结分享)Aug 04, 2022 pm 02:35 PM

js是弱类型语言,不能像C#那样使用param关键字来声明形参是一个可变参数。那么js中,如何实现这种可变参数呢?下面本篇文章就来聊聊JavaScript函数可变参数的实现方法,希望对大家有所帮助!

盘点Python内置函数sorted()高级用法实战盘点Python内置函数sorted()高级用法实战May 13, 2023 am 10:34 AM

一、前言前几天在Python钻石交流群有个叫【emerson】的粉丝问了一个Python排序的问题,这里拿出来给大家分享下,一起学习下。其实这里【瑜亮老师】、【布达佩斯的永恒】等人讲了很多,只不过对于基础不太好的小伙伴们来说,还是有点难的。不过在实际应用中内置函数sorted()用的还是蛮多的,这里也单独拿出来讲一下,希望下次再有小伙伴遇到的时候,可以不慌。二、基础用法内置函数sorted()可以用来做排序,基础的用法很简单,看个例子,如下所示。lst=[3,28,18,29,2,5,88

学Python,还不知道main函数吗学Python,还不知道main函数吗Apr 12, 2023 pm 02:58 PM

Python 中的 main 函数充当程序的执行点,在 Python 编程中定义 main 函数是启动程序执行的必要条件,不过它仅在程序直接运行时才执行,而在作为模块导入时不会执行。要了解有关 Python main 函数的更多信息,我们将从如下几点逐步学习:什么是 Python 函数Python 中 main 函数的功能是什么一个基本的 Python main() 是怎样的Python 执行模式Let’s get started什么是 Python 函数相信很多小伙伴对函数都不陌生了,函数是可

Python面向对象里常见的内置成员介绍Python面向对象里常见的内置成员介绍Apr 12, 2023 am 09:10 AM

好嘞,今天我们继续剖析下Python里的类。[[441842]]先前我们定义类的时候,使用到了构造函数,在Python里的构造函数书写比较特殊,他是一个特殊的函数__init__,其实在类里,除了构造函数还有很多其他格式为__XXX__的函数,另外也有一些__xx__的属性。下面我们一一说下:构造函数Python里所有类的构造函数都是__init__,其中根据我们的需求,构造函数又分为有参构造函数和无惨构造函数。如果当前没有定义构造函数,那么系统会自动生成一个无参空的构造函数。例如:在有继承关系

Golang函数的类型断言用法介绍Golang函数的类型断言用法介绍May 16, 2023 am 08:02 AM

Golang的函数类型断言是一个非常重要的特性,它可以让我们在函数中精细地控制变量的类型,从而更加方便地进行数据处理和转换。本文将介绍Golang函数的类型断言用法,希望能够对大家的学习有所帮助。一、什么是Golang函数的类型断言?Golang函数的类型断言可以理解为函数参数中所声明变量的类型具有多态性,这使得一个函数在不同的参数传递下可以灵活

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software