PHP实现杨辉三角形

<?php
/****
 * 杨辉三角形:我的实现方式。
 *                          下标
 * 1                        0
 * 1 1                      1           循环上一行数据1次,计算后结果追加到当前行末尾
 * 1 2 1                    2
 * 1 3 3 1                  3
 * 1 4 6 4 1                4
 * 1 5 10 10 5 1            5
 * 规律:
 * 1、就是一个二维数组的遍历,数组下标 0 开始。
 * 2、每一行都是 1 为首位,剩下的数字为上一行的下标作为最大循环次数-1来分别计算上一行的数据追加到当前行末尾。计算方式:上一行的当前下标的数据值+上一行的当前下标+1的数据值=当前行末尾追加数据值(c=a[b]+a[b+1])。
 * 3、有两点需要注意:①循环下标为 0 的行时,-1 不存在,所以直接跳过当前循环。②上一行数据计算时,按照规律 c=a[b]+a[b+1]来计算,第 0 行数据就开始不满足这个规律了,可以通过 a[b+1] 值不存在时看作值为 0 处理。
 */

/***
 * 实现方式一
 * 注意:只能支撑到1700行,1800行直接报内存的错(Fatal error: Allowed memory size of 134217728 bytes exhausted)。
 * PHP版本:5.6.27
 */

//不限制执行时间
set_time_limit(0);

//指定三角形的行数
$line=5;

//定义一个空数组
$square_arr=array();

for($j=0;$j<$line;$j++){
    //初始化每行首位数字
    $square_arr[$j]=array(1);
    //上一行的下标
    $temp_index=$j-1;
    //获取上一行的数据
    $temp_arr=isset($square_arr[$temp_index])?$square_arr[$temp_index]:array();
    //上一行不存在直接跳过本次循环
    if(empty($temp_arr)) continue;
    //计算当前行剩余数据
    for($o=0;$o<$j;$o++){
        //获取上一行当前下标+1数值,不存在则为 0
        $last_num = isset($temp_arr[$o+1])?$temp_arr[$o+1]:0;
        //上一行当前下标数值+(上一行当前下标+1)数值
        $end_num = $temp_arr[$o]+$last_num;
        //将结果追加到当前行
        array_push($square_arr[$j],$end_num);
    }
    //销毁变量
    unset($temp_index,$temp_arr);
}

//遍历结果
foreach($square_arr as $square_val){
    echo implode(' ',$square_val);
    echo '<br>';
}


echo '<hr>';


/***
 * 实现方式二
 * 在 实现方式一 的基础上做了优化,测试可实现10w行。执行时间为:2793.508秒;PHP版本:7.0.29
 */

//设置无限执行时间
set_time_limit(0);

//能够支撑到100000行,执行时间:
$line=5;

//初始化第一行(同时用来存储每最后一行数据)
$square_arr=array(1);

//计算第二行开始剩下的数据
for($j=1;$j<$line;$j++){
    //用来存储当前行数据
    $now_arr=array(1);

    //计算当前行剩余数据
    for($o=0;$o<$j;$o++){
        //获取上一行当前下标+1数值,不存在则为 0
        $last_num = isset($square_arr[$o+1])?$square_arr[$o+1]:0;
        //上一行当前下标数值+(上一行当前下标+1)数值
        $end_num = $square_arr[$o]+$last_num;
        //将结果追加到当前行
        array_push($now_arr,$end_num);
    }

    //输出上一行数据
    echo implode(' ',$square_arr).'<br>';
    //将上一行数据替换成当前行数据
    $square_arr=$now_arr;
    //销毁变量
    unset($now_arr);
}

//因为最后一行保持在初始数组内,所以最后要输出一下初始数组
echo implode(' ',$square_arr).'<br>';
unset($square_arr);

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/chenmoimg_/article/details/80189453
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞