You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

完全符合需求。

修正说明

  1. Conway函数中,将初始字符串移到循环外,确保每次迭代基于上一次的结果生成新项,而非重复从头开始。
  2. 简化字符串拼接逻辑,避免运算符优先级问题,代码可读性更强。
  3. sequence函数移除错误的嵌套循环,直接用for遍历所有需要输出的项,使用PHP_EOL保证跨平台换行兼容性。

内容的提问来源于stack exchange,提问作者Asoia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:35:16