今天无意间翻到了《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. AFNetworking2.0 NSHipster翻译

    AFNetworking 是当前 iOS 和 Mac OS X 开发中最广泛使用的开源项目之一.它帮助了成千上万叫好又叫座的应用,也为其它出色的开源库提供了基础.这个项目是社区里最活跃.最有影响力的项 ...

  2. PPT 学习总结

    PPT高效制作流程1.把word导入PPT2.在PPT里实现随机抽奖3.逻辑的调整:给PPT增加小节,来增强PPT的逻辑性4.设计PPT的母板,并可保存为自己的母板供以后使用 数据收集中国宏观经济统计 ...

  3. gitlab hooks

    之前一直用文件同步工具进行两台服务器之间的同步 最初的目的是吧gitlab的代码库同步到开发环境中运行 实时的 ,后来由于gitlab的代码仓库的代码不是实时的 于是在即使同步不适合 我的需求. 后来 ...

  4. [RxJS] Filtering operators: distinct and distinctUntilChanged

    Operator distinct() and its variants are an important type of Filtering operator. This lessons shows ...

  5. 使用org.apache.jasper.JspC编译jsp文件--转载

    JspC可以通过jspc.setArgs(args);设置所需参数,和使用指令进行编译相同, 使用指令编译范例: java -cp jasper.jar;servlet-api.jar;Fcatali ...

  6. iOS-iPad开发之popoverController使用介绍

    iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...

  7. CentOS 6.3 源码安装LAMP(Linux+Apache+Mysql+Php)环境

    一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而>言都是在它所 ...

  8. 最近的两个小项目,2:Python webapp的docker镜像

    时间过得真快,一眨眼一个多月没更新了,但这一个月我可没偷懒啊,真的是忙.粘上两篇ReadMe勉强凑合一下,保持博客更新是好习惯. 基于Flask框架,uwsgi起服务,supervisor做管理,应该 ...

  9. HTML设置固定页脚飘浮

    Css /* 页脚 */.footSty{bottom: 0pt; margin: 0pt; position: fixed; width: 100%; z-index: 10 ! important ...

  10. php生成不重复随机字符串

    使用时间戳作为原始字符串,再随机生成五个字符随机插入任意位置,生成新的字符串,保证不重复 function rand($len) { $chars='ABCDEFGHIJKLMNOPQRSTUVWXY ...