今天无意间翻到了《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. zoj 2734 Exchange Cards【dfs+剪枝】

    Exchange Cards Time Limit: 2 Seconds      Memory Limit: 65536 KB As a basketball fan, Mike is also f ...

  2. google、baidu高级搜索技巧

    1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...

  3. 终端command总结

    Ctrl+Alt+Delete Ctrl+Shift+Esc Ctrl+D Alt+F4 Shift+F10 win+m Ctrl+Alt+. Ctrl+A Ctrl+S osk taskmgr cm ...

  4. android的生命周期

    1.运行状态:当一个活动处于栈的顶部时,这时活动就处于活动状态,系统是不愿意回收处于活动状态的,会影响用户体验. 2.暂停状态:当一个活动不再处于栈的顶部时,但仍然可见时,这时就是暂停状态了.处于暂停 ...

  5. python 多级菜单 纯循环与分支

    源代码: dic1 = {'湖南':{'衡阳':{'珠晖区':'湖南工学院'},'湘潭':{'晖晖':'啦啦'}}, '北京':{'朝阳': {"德玛:北京大学"}}}print( ...

  6. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  7. Android 开发中 iBeacon的使用

    iBeacon的工作原理是基于Bluetooth Low Energy(BLE)低功耗蓝牙传输技术,iBeacon基站不断向四周发送蓝牙信号,当智能设备进入设定区域时,就能够收到信号.只要满足iBea ...

  8. Java语言基础(九)

    Java语言基础(九) 一.自增运算(++) 自减运算(--) i++ 就是将i+1再赋给 i i-- 是将i-1再赋给 i 对变量i,j来说,i++ 或++i 这里没什么区别,都是将i的值加1后,再 ...

  9. Java中Date各种相关用法

    Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...

  10. JS cookie 读写操作

    /*** ** 功能: cookie操作对象 ***/ var cookies = { /*** ** 功能: 写入cookie操作 ** 参数: name cookie名称 ** value coo ...