首页 编程语言 杨辉三角原理及PHP代码实现

杨辉三角原理及PHP代码实现

杨辉三角,又称帕斯卡三角,是我国南宋数学家杨辉在1261年所著的《详解九章算法》中首次记录的一种三角形数表,在欧洲则称为帕斯卡三角(Blaise Pascal,1653年研究)。它是一个无限对称的数字金字塔

研究规则设定:

杨辉三角构造规则
杨辉三角是一个由数字排列成的三角形数表,其构造规则非常简单:

顶端数字:第 0 行只有一个数字 1。
边界数字:从第1行开始,每一行的最左边和最右边的数字都是 1。
中间数字:除了边界外,中间的每一个数字都等于它正上方和左上方两个数字之和。
用数学公式表示:
规则设定:行 n 从 0 开始计数,列 k 也从 0 开始计数。

如果设 C(n,k) 为第 n 行第 k 列的数字(行和列都从 0 开始计数,且 n ≥),则:
C(n,k) = C(n-1, k-1) + C(n-1, k)
另外,每行首尾的数为:C(n,0) =1且 C(n,n)=1。

通过分析,我得出的的几个关键特点:
n代表第n行(n从0开始计数),k代表第k列(k从0开始计数)。
第 0 行:有1个数,1。
第 1 行:有2个数,1、1。
第 2 行:有3个数,1、2、1。
第 n 行:有n+1个数,第n+1个数的索引值是n,第n个数的索引值是n-1。

n 必须满足的条件是:n ≥ 2。因为只当行数n ≥ 2时,才存在中间元素。
k 必须满足的条件是:k ≥ 1 && k ≤ n-1,也就是说,让k定位到每一行不是首尾的数。

代码逻辑解析:

初始化:我们创建一个空数组 $triangle 来存储整个三角形。
外层循环:遍历每一行(从 0 到 $numRows - 1)。
行初始化:对于第 $i 行,我们创建一个长度为 $i + 1 的数组,并全部填充为 1。这一步巧妙地利用了杨辉三角“两端为 1”的特性,省去了单独判断首尾的代码。
内层循环:从第 2 行(索引为 2)开始,遍历该行中间的元素(索引从 1 到 $i - 1)。
状态转移:利用公式 $row[$j] = $triangle[$i - 1][$j - 1] + $triangle[$i - 1][$j] 计算当前值。这里 $triangle[$i - 1] 代表上一行。
存储:将构建好的行添加到 $triangle 数组中。
用 PHP 实现的杨辉三角算法
<?php
declare (strict_types = 1);

/**
* 生成杨辉三角
* 采用“先填充默认值 1,再计算中间值”的策略。
* @param int $numRows 需要生成的行数。
* @return array 返回一个二维数组。
*/

function generateYangHuiTriangle(int $numRows): array {
// 防御性编程:处理非正数输入
if ($numRows <= 0) {
return [];
}

$triangle = [];

for ($i = 0; $i < $numRows; $i++) {
// 首先把每一行的值全部初始化为 1。
$row = array_fill(0, $i + 1, 1);

// 计算中间值。只有当 i ≥ 2 时,才存在中间元素(索引 j ≥ 1 && j ≤ i-1)。
for ($j = 1; $j < $i; $j++) {
$row[$j] = $triangle[$i - 1][$j - 1] + $triangle[$i - 1][$j];
}

$triangle[] = $row;
}

return $triangle;
}

// print_r(generateYangHuiTriangle(5));

$rows = 5;

// 格式化输出杨辉三角
echo "<h3>杨辉三角({$rows}行)</h3>";

$triangle = generateYangHuiTriangle($rows);
foreach ($triangle as $line) {
echo str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $rows - count($line));
echo implode("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $line) . "<br>";
}

站星网

杨辉三角,又称帕斯卡三角,是我国南宋数学家杨辉在1261年所著的《详解九章算法》中首次记录的一种三角形数..

为您推荐

《一个程序猿的生命周期》-《发展篇》- 49.从写代码、到开发软件产品、再到开拓前端市场,2025年是转型关键的一年

已然工作了19个年头,从2006年毕业,干了1年设备安装及维护的工作(2006年~2007年),尽管当时很辛苦,但是奠定了现在做事的品格与韧性;干了18年(2007年~2025年)的软件开发、项目实施及管理团队相关工作,期间出..

代码管理平台全景解析:从新手到企业级开发的最佳实践

在数字化转型浪潮中,代码管理工具已成为开发者必备的"生产工具"。无论是个人开发者还是企业团队,选择合适的代码管理平台不仅能提升开发效率,更能为项目协作与代码安全保驾护航。本文将深入剖析Gitee、Git、GitHub..

代码照进现实:对公司管理策略的技术性解构

上学的时候觉得计算机专业的一些理论晦涩难懂,跟现实世界的关联太少,每当遇到一些精妙的设计时都会发出一种感叹:究竟是什么脑袋才能想出这么有意思的东西。一晃工作十年,阅历渐丰,隐约发现其实社会中的一些现象..

编写优秀 CSS 代码的 8 个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策..

天天写业务代码,如何成为技术大牛?

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使我们不断地努力和提升自己。然而"梦想是美好的,现实却是残酷的",很多..

记我经历的一次公司破产经历,一行代码害死一家公司

前言这是一篇亲身经历的真实记录,事情发生在2010年。狗血剧情一再上演,使我的程序员生涯变得跌宕起伏,也从中学到了很多。在写这篇文章之前,我还专门去查了这家公司的资料。有如下事实:1.官网已经打不开了。2.天..

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是一个繁琐而艰巨的任务,但是由于使用其他开..

对码农而言什么样的代码才能叫做好代码?

好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候..

当一个程序员写不出代码了,该怎么办?

你已经对着电脑n个小时了。不知道该写什么代码,或者一种摔键盘的冲动正在你的胸中酝酿。咖啡一杯接着一杯。不敢再喝了,因为搞不好要有副作用了,心跳加速,身体不由自主地颤抖,出冷汗,但还是无法产出任何代码。..

ASP.NET MVC最常用的设计模式代码示例

ASP.NET MVC 是一个基于分层架构的框架,其核心架构本身已经实现了 MVC 模式(Model-View-Controller)。除了 MVC 模式,开发者在使用 ASP.NET MVC 开发应用时,通常会结合其他设计模式以提高代码的可维护性、可扩展..

10款.NET开发中推荐的代码分析和质量工具

以下是10款.NET开发中常用的代码分析和质量工具列表,以及它们的主要功能和使用场景:1. SonarQube简介:一个流行的开源静态代码分析平台,用于检测代码中的漏洞、错误、技术债务等问题。主要功能:支持代码质量监测..

.NET C# EntityFramework(EF)连接SQLite代码示例

在.NET C#中使用Entity Framework(EF)连接SQLite数据库是一种常见的做法,可以有效地管理和操作数据。以下是一个简单的示例代码,展示了如何使用EF Core连接到SQLite数据库并执行基本的CRUD操作。首先,确保你已经..

设计模式之高质量代码

0,什么是高质量代码我觉得回答这个问题,应该从两个方面考虑。从业务角度考虑。首先,在公司开发一款软件,应该是业务在驱动。所以,从这个角度来说,代码第一个应该满足的是业务需求,如果连最基本的业务需求都满..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

C#发送邮件代码简洁示例(附源码下载)

C#发送邮件,主要使用的是System.Net.Mail命名空间下的方法实现,方法很简单,短短十几行代码即可完成发送,具体代码如下。 try { MailMessage myMail = new MailMessage(); myMail.From = new MailAddress..

AutoMapper.AutoMapperMappingException”类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理

今天修改别人的代码抛出了这样的异常: AutoMapper.AutoMapperMappingException&rdquo;类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理。进行了调试,往下走的时候直接报错了,百度之~中文网站上没..

支付宝第三方支付平台对接原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..

c#无损压缩图片代码,可设置压缩质量

之前写过一篇文章《使用htmlagilitypack+xpath抓取网页内容示例》,提到使用htmlagilitypack抓取网页信息。想做一个网络爬虫,但是想把网页上的图片也下载到本地,于是写了下载图片的功能。但是第三方网站上的图片大..

Linq to Object的Where和Select实现原理

Linq的Where是一个基于委托的代码封装,把数据筛选的通用逻辑完成,把判断逻辑交给委托传递。Select是基于委托的代码封装,把数据转换的通用逻辑完成,把转换逻辑交给委托传递。Linq还有很多方法,这些方法大多都是..

.Net各版本多线程使用原理和实践

多线程基本概念进程:程序在服务器上运行时,占据的计算资源合集,称之为进程。进程之间不会互相干扰,进程间的通信比较困难(分布式)。线程:程序执行的最小单位。线程也包含自己的计算资源,线程是属于进程的,一..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制
星辰影视-2025热门免费影视短剧平台熊猫影视-2025热门免费影视短剧平台番茄影视-2025热门免费影视短剧平台星光电影-2025热门免费影视短剧平台蜂鸟影院-2025热门免费影视短剧平台熊猫影视 - 全网高清免费影片聚合平台萝卜影院-2025热门电影电视剧免费在线播放-全站无广告高速播放下载樱花影院-2025热门免费影视短剧平台琪琪影视-2025热门免费影视短剧平台火影电影网-2025热门免费影视短剧平台悟空电影-2025热门免费影视短剧平台西瓜影院-2025热门免费影视短剧平台星空电影网-2025热门免费影视短剧平台好看电影网-2025热门免费影视短剧平台无忧影视网_高清影视在线观看分享平台_最新最全的免费影视短剧大全年钻网超清视界 - 全网高清免费短剧聚合平台极影公社-2025热门电影电视剧免费在线播放至尊影院-最新热门短剧免费电影网站_高清影视无弹窗极速播放星光电影-2025热门免费影视短剧平台河马影视-最新热门火爆的免费影视网站_高清影视夸克迅雷网盘下载叮当影视网-2025热门高清免费影视短剧分享平台70影视网 - 最新电影、电视剧、短剧、免费在线观看麻花影视网 - 高清免费聚合电影网西瓜影院-最新热门电影电视剧免费在线播放开心追剧网2048影视资源论坛-2048P.Com青青影视网-2025热门高清免费影视短剧分享平台八哥电影网_最新vip电影大全_热播电视剧_全网优质影视免费在线观看_老牌的免费在线影院_www.886958.com人人看电影-热播电视剧_2025年最新电影_人人影院高清在线免费观看天天影视网-高清免费电影、电视剧、短剧在线观看星辰影视-最新热门无广告的免费电影网站_高清影视无弹窗极速播放电影天堂爱看影院追剧达人U系列网盘资源橙子影视网天堂影视网天堂影视神马影院网大众影视网星辰影视网