PHP实现外观数列(Look-and-Say Sequence)函数故障求助
外观数列函数修复方案
原代码存在的问题
- Conway函数迭代逻辑错误:每次循环都将
$str重置为"11",无法基于前一次的结果生成后续项,导致无论输入多大的n,最多只能得到第3项的结果"21"。 - sequence函数循环逻辑混乱:错误混用
for和do-while,无法正确遍历所有需要输出的行。 - 字符串拼接优先级问题:
$tmp = $tmp.$cnt + 0中加法运算符优先级高于字符串连接,可能引发意外的类型转换错误。
修正后的代码
生成单行外观数列的Conway函数
function Conway($n) { // 第1项对应迭代0的结果:"1" if ($n == 1) return "1"; // 第2项对应迭代1的结果:"11" if ($n == 2) return "11"; // 从第2项开始,基于前一次结果迭代生成后续项 $currentStr = "11"; for ($i = 3; $i <= $n; $i++) { // 添加结束标记,方便处理最后一组连续字符 $currentStr .= '$'; $len = strlen($currentStr); $cnt = 1; $tmp = ""; for ($j = 1; $j < $len; $j++) { if ($currentStr[$j] != $currentStr[$j - 1]) { // 拼接计数+对应字符 $tmp .= $cnt . $currentStr[$j - 1]; $cnt = 1; } else { $cnt++; } } // 更新为当前迭代的结果,用于下一次循环 $currentStr = $tmp; } return $currentStr; }
输出所有迭代行的sequence函数
function sequence($nth) { // 迭代输出从第1项到第nth+1项,对应迭代0到nth的所有结果 for ($i = 1; $i <= $nth + 1; $i++) { echo Conway($i) . PHP_EOL; } }
测试验证
调用sequence(3);会输出:
1 11 21 1211
完全符合需求。
修正说明
- Conway函数中,将初始字符串移到循环外,确保每次迭代基于上一次的结果生成新项,而非重复从头开始。
- 简化字符串拼接逻辑,避免运算符优先级问题,代码可读性更强。
- sequence函数移除错误的嵌套循环,直接用
for遍历所有需要输出的项,使用PHP_EOL保证跨平台换行兼容性。
内容的提问来源于stack exchange,提问作者Asoia
相关产品推荐
相关产品推荐

