<?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);

PHP实现杨辉三角形的更多相关文章

  1. java 实现(代码) -- 水仙花数 + 杨辉三角形

    /* 在控制台输出所有的“水仙花数” 水仙花:100-999 在以上数字范围内:这个数=个位*个位*个位+十位*十位*十位+百位*百位*百位 例如:xyz=x^3 +y^3 +z^3 怎么把三位数字拆 ...

  2. 洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  3. [LeetCode 118] - 杨辉三角形(Pascal's Triangle)

    问题 给出变量numRows,生成杨辉三角形的前numRows行. 例如,给出numRows=5,返回: [     [1],    [1,1],   [1,2,1],  [1,3,3,1], [1, ...

  4. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)

    问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O(k)的额外空间吗? 初始思路 首先来复习复习杨辉三角形的性质 ...

  5. C# 杨辉三角形算法

    代码如下: static void Main(string[] args) { int[][] Array_int = new int[10][]; //向数组中记录杨辉三角形的值 for (int ...

  6. 杨辉三角形II(Pascal's Triangle II)

    杨辉三角形II(Pascal's Triangle II) 问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O( ...

  7. 17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。 (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和。) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

    17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 1 ...

  8. Gym 100952 D. Time to go back(杨辉三角形)

    D - Time to go back Gym - 100952D http://codeforces.com/gym/100952/problem/D D. Time to go back time ...

  9. Java温故而知新-杨辉三角形

    Java温故而知新-杨辉三角形 一. 先说需求 需求 打印输出杨辉三角形,行数可变,支持50行内的任意数. 预期结果如图所示 1 这是第几行呢,是第1 1 1 这是第几行呢,是第2 1 2 1 这是第 ...

  10. C#输出杨辉三角形

    话不多说直接上代码: class Program { static void Main(string[] args) { ;//杨辉三角形的长度 Console.Write("输入杨辉三角长 ...

随机推荐

  1. nyoj--983--首尾相连数组的最大子数组和(动态规划)

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...

  2. [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)

    题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...

  3. Linux进程精讲

    进程相关概念 程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁....) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  4. sas与mysql连接方法

    2012年8月11日 sas 9.1.3 版本 与mysql 连接 测试,可以与数据库连接1  通过odbc 直接连通 pass through connect to odbc create tabl ...

  5. GPG加密windows中使用

    在Windows系统使用Gpg4win进行加密解密 2015-06-15 by u014076884 GPG,又称为GnuPG,全称是Gnu Private Guard,即GNU隐私卫士.GPG是以P ...

  6. Pharmaceutical的同学们都看过来,关于补码运算的复习相关内容

    虽然是全英文的课程,这次总结内容不用英文了. 一般在计算机原理中,对两个操作数进行运算会使用C作为进位的标志位,而V作为溢出的标志位. 一般我们学完计算机原理,都知道正数的原码反码补码都一样,而问题都 ...

  7. Activity-数据状态的保存

    由于手机是便捷式移动设备,掌握在用户的手中,它的展示方向我们是无法预知的,具有不确定性.平时我们拿着手机多数为竖屏,但有时候我们感觉累了也会躺着去使用手机,那么这时手机屏幕的展示方向可能已经被用户切换 ...

  8. SQL中一次插入多条数据

    SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不 ...

  9. OUTLOOK网站直接点击发送邮件

    下面的样式是用文字来做链接的:<a href="mailto:邮箱地址" alt="点击此链接给我写信">网页上显示的文字</a> 下面 ...

  10. vue 事件参数传$event打印当前组件

    <template> <div class="hello"> <button v-on:click.once="getinfo($event ...