今天无意间翻到了《PHP经典实例》中字符串章节中关于Look and Say序列的那个程序:

  1. <?php
  2. function lookandsay($s) {
  3. //将保存返回值的变量初始化为空字符串
  4. $r = '';
  5. //$m 用于保存我们要查找的字符,
  6. //同时将其初始化为字符串中的第一个字符
  7. $m = $s[0];
  8. //$n 用于保存我们找到的$m的数目,将其初始化为1
  9. $n = 1;
  10. for($i = 1, $j = strlen($s); $i < $j; $i++){
  11. //如果这个字符与上一个字符相同
  12. if($s[$i] == $m){
  13. //这个字符的数目加1
  14. $n++;
  15. }else {
  16. //否则,把数据和这个字符追加到返回值
  17. $r .= $n.$m;
  18. //把要找的字符设置为当前的字符
  19. $m = $s[$i];
  20. //并把数目重置为1
  21. $n = 1;
  22. }
  23. }
  24. //返回构建好的字符串以及最终的数目和字符
  25. return $r.$n.$m;
  26. }
  27.  
  28. for($i = 0, $s = 1; $i <10; $i++) {
  29. $s = lookandsay($s);
  30. print "$s <br/>\n";
  31. }
  32. ?>

  之前看的时候没看懂,觉得第一次输出的数据应该是“11”,而不应该是“1”,然后自信满满的以为程序本身有问题,也没有去深究原因,之后就不了了之了。今天拿出来主要是说说我当初究竟出在哪了。

  我们都知道PHP是一个弱类型的语言,声明变量的时候不用标明数据类型,声明函数的时候也不用标明数据类型,久而久之,使我们对于变量的数据类型越来越不敏感了,对于这个程序而言,我的问题就出在了这里:

  1. //同时将其初始化为字符串中的第一个字符
  2. $m = $s[0];

  在第一次调用lookandsay()的时候传过来的参数$s的数据类型不是字符串类型,而是整型。php支持将字符串当做一个下标从0开始的数组来处理,使用花括号和下标来读取数据,比如$str{42},但在PHP5.3.0中不推荐使用这种格式,应该用方括号,像这样$str[42],但是如果用[]或{}来读取其它类型的变量(比如整型变量)则只会返回NULL。所以第一次调用函数时只返回一个“1”,当将这个“1”重新赋值给$s时,$s则变成了字符类型。所以第二次调用时返回值为“11”。

  所以在使用php编程的时候,不要因为它是弱类型的语言就忽略数据类型对程序执行过程中产生的影响。当然这只是我个人的看法。

关于Look and Say序列的感想的更多相关文章

  1. 做中学learning by doing——个人感想20155312张竞予

    做中学learning by doing--个人感想 概要 阅读五篇博客后的感触 我的个人技能 个人经验的类比与总结 c语言学习情况 java学习目标及规划 公文写作能力 我的感触 仔细阅读了老师公众 ...

  2. poj 1659 Frogs' Neighborhood (贪心 + 判断度数序列是否可图)

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 6076   Accepted: 26 ...

  3. 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列

    题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...

  4. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  5. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  6. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  7. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  8. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  9. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

随机推荐

  1. runtime/KVO等面试题

    整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...

  2. dom0的cpu hotplug【续】

    上一篇说到,手动xm vcpu-pin住,在hotplug就好了. 本质上,还是因为代码有bug,导致vcpu offline的时候,信息没有清理干净,有残留,当vcpu online的时候,如果调度 ...

  3. 【Android - 进阶】之图片压缩

    很多时候,如果APP需要下载和加载很多图片(尤其是大图片)的时候,就往往会报如下图所示的错误: 如上图所示,OOM(OutOfMemoryError)表示内存溢出,这是因为网络或内存中的图片被加载成B ...

  4. (使用步骤)ThinkPHP3.1.2中如何配置Ckeditor_4.1.1和Ckfindtor(转)

    ThinkPHP3.1.2中如何配置Ckeditor_4.1.1和Ckfindtor  一.下载Ckeditor和Ckfinder Ckeditor官网 http://ckeditor.com/dow ...

  5. 用的最多的Android Studio 快捷键

    1.Ctrl+D,Ctrl+C 复制删除整一行 2.Ctrl+Alt+L 格式化代码 看起来更好看 3.Ctrl+Q 查看函数API定义 4.Atl+方向键 切换不同文档 平时用快捷键能够提高效率,少 ...

  6. 自定义的插件如何加载到Qt Designer中(详细)

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...

  7. Customizing the Test Runner

    There are several situations where you want to customize Robolectric's test runner to perform some o ...

  8. CentOS修改主机名hostname

    方法一:即时生效,重启后失效 hostname 新主机名 方法二:永久生效 1.修改/etc/hosts vim /etc/hosts 127.0.0.1 localhost 新主机名 2.修改/et ...

  9. linux下vi命令笔记

    vim 编辑器 全屏编辑器 模式化编辑器 vi:Visual Interfacevim:VI iMproved vi增强版vi模式:    编辑模式(命令模式)(默认处于编辑模式)        Ct ...

  10. C# GridView点击某列打开新浏览器窗口

    C# GridView点击某列打开新窗口的方式: (1)打开浏览器新窗口:蓝色部分 通过超链接. (2)打开模式化窗口:通过OnRowCommand事件,弹出模式化窗口. 具体如下: <asp: ...