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

<?php
function lookandsay($s) {
//将保存返回值的变量初始化为空字符串
$r = '';
//$m 用于保存我们要查找的字符,
//同时将其初始化为字符串中的第一个字符
$m = $s[0];
//$n 用于保存我们找到的$m的数目,将其初始化为1
$n = 1;
for($i = 1, $j = strlen($s); $i < $j; $i++){
//如果这个字符与上一个字符相同
if($s[$i] == $m){
//这个字符的数目加1
$n++;
}else {
//否则,把数据和这个字符追加到返回值
$r .= $n.$m;
//把要找的字符设置为当前的字符
$m = $s[$i];
//并把数目重置为1
$n = 1;
}
}
//返回构建好的字符串以及最终的数目和字符
return $r.$n.$m;
} for($i = 0, $s = 1; $i <10; $i++) {
$s = lookandsay($s);
print "$s <br/>\n";
}
?>

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

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

    //同时将其初始化为字符串中的第一个字符
$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. Windows版本搭建安装React Native环境配置及相关问题

    此文档整理参考地址: http://www.lcode.org/%E5%8F%B2%E4%B8%8A%E6%9C%80%E8%AF%A6%E7%BB%86windows%E7%89%88%E6%9C% ...

  2. 20169210《Linux内核原理与分析》第三周作业

    本次作业也是分为两部分,第一部分是对实验楼<Linux基础入门>复习,第二部分为对课本18章的复习. 第一次学习实验楼的<Linux基础入门>时由于是第一次接触Linux,所以 ...

  3. spring 自定义schema

    扩展schema,定义自己的bean属性..不错! 主要: 1,定义META-INF下.xsd文件,这里是people.xsd;定义spring.handlers;定义spring.schemas 2 ...

  4. DAG最短路算法

    #include <cstdio> #include <iostream> #include <queue> #include <vector> #in ...

  5. Windows 下OpenSSL 安装

    安装环境: .操作系统:Windows XP SP2 2.C++编译器:VC++ 6.0 下载: 下载ActivePerl  5.10.1.1007(最新的版本或较低的版本也可以): 下载地址:htt ...

  6. android 53 ContentProvider内容提供者

    ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...

  7. IntelliJ Idea 常用快捷键列表(精简版)

    查找快捷键: Ctrl+N 查找类 Ctrl+shift+N 查找文件 Ctrl+B 找变量来源 Ctrl+E 最近打开的文件 Ctrl+Alt+B 选中方法的实现 Ctrl+F7  选中方法(属性. ...

  8. 关于 Android 进程保活,你所需要知道的一切

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...

  9. cookingk配置项中的chunk:true含义

    学习cooking,查看中文文档,发现有个配置chunk: true, 不明白具体含义,于是根据注释,找到了相关代码, 即chunk: true等同于以下代码: var webpackConfig = ...

  10. iOS UIKit:viewController之Segues (4)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...