0

0

对函数及递归的通俗理解_PHP教程

php中文网

php中文网

发布时间:2016-07-14 10:09:41

|

1039人浏览过

|

来源于php中文网

原创

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

下面是课本上的列子,就拿出来,用我的理解来做解释。希望能帮到对这块还没弄懂的兄弟。
    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
函数和递归的使用,最终就是解析成上面的代码执行的,
这就是我理解的函数,以及递归,用一句话说:“本来江湖上是没有递归的,出现的函数多了,也就有了递归。”
一点简单的理解,希望能帮助没有基础的兄弟理解函数,理解递归,最终形成自己的理解自己的想法和思路

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477637.htmlTechArticle没有基础的兄弟可能对函数的递归比较难以理解,特别是递归里返回输出的概念理不清,是如何返回的。 下面是课本上的列子,就拿出来,...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1044

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

334

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

213

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

35

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

111

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

813

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

97

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 6万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.6万人学习

Sass 教程
Sass 教程

共14课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号