<?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. 最长公共子序列(稀疏序列)nlogn解法

    首先这种做法只能针对稀疏序列, 比如这种情况: abc abacabc. 会输出5 ,,,,就比较尴尬, #include<iostream> #include<cstdio> ...

  2. 安装Windows服务方法

    用sc create 服务名 binPath="路径",不要用老方法InstallUtil会出现一堆的错误

  3. 【原创】Apache和Tomcat实现动静分离

    集群中每个节点都启用了页面静态化功能,所以,为了防止单个节点刷新造成找不到页面问题,将每个节点刷新的页面都放入apache虚拟目录下,由apache统一来处理.静态页面由apache处理,动态页面仍然 ...

  4. Python3基础笔记---面向对象

    只是对一些新的知识的记录 1.创建类 class ClassName: <statement-1> . . . <statement-N> 类实例化后,可以使用其属性,实际上, ...

  5. MySQL常用技能篇

    写在之前的话: 之前一直在用MSSERVER,刚用MySQL时有很多的不适应.就此小结一下工作中遇到的问题和场景(用的不是很深入,供初学者参考),文中出现的局限性欢迎指出 MySQL有客户端式(SQL ...

  6. [AHOI2013]作业 莫队 树状数组

    #include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...

  7. mysql 临时表和内存表

    查看内存表的最大值: show variables like '%heap%'; mysql> show variables like '%heap%'; +------------------ ...

  8. [洛谷P1750]KC喝咖啡

    题目大意:给你n个物品,每个物品有一个价值$v_i$和一个时间$t_i$,要你取m个物品,使得他们的美味度($\frac{\sum v_i}{\sum t_i}$)最大,求这个美味度. 解题思路:由于 ...

  9. vue之computed和watch

    计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...

  10. 高并发web系统设计

    转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...