实现效果:杨辉三角

即:

 提示用户输入要实现的杨辉三角行数:

请输入杨辉三角的行数:
8 代码实现后的效果如下:
1
1.1
1.2.1
1.3.3.1
1.4.6.4.1
1.5.10.10.5.1
1.6.15.20.15.6.1
1.7.21.35.35.21.7.1

  

  在这里我将用到js中数组的知识来完成,我将用二维数组来储存这个序列,其中外层数组储存所有的值,里层数组将储存每一行的值。

  我的思路是:

    1.获取用户输入要的行数。

    2.创建二维数组并进行计算,优先计算出所需要的数值,并按行储存,输出之后效果如下:

      1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

    3.对以上的数据,按照杨辉三角的要求进行调整格式,即在每行数字的前面增加相应的空格。

     

方法中的难点如下: 

  1.创建数组

  众所周知,js中创建的数组为一维数组,但是我要用二维数组才能完成,那么就要用到js中的构造函数创建数组的方法创建一个伪二维数组,代码如下:

    let arr = [];   //创建一维数组(用作外层,储存所有数据)
for(let i=0;i<lineCount;i++){ //lineCount 为变量,用于存储用户输入的行数
arr[i]=new Array(i+1); //对每行创建一个长度为i+1的数组,用于存储每行的数据
}

  以上代码中,二维数组长度给了i+1,实际上对应了杨辉三角的行数和当前行的数字数量相同的特征,给了长度,方便后面直接对其赋值。若不给长度,后面就要用push的方法增加,但是我不建议这样做,如果用push增加数据进去,会造成增加的数据不便于后期计算(亲测试验过的,感兴趣的小伙伴也可以自己实践体会下)。

  2.按照规律进行计算,杨辉三角的规律为:除了每行的第一个数和最后一个数为1外,中间的数为上一行的对应的两个数相加的和。

for (let i = 0; i < lineCount; i++) {
// 计算每个值装进数组中
for (let j = 0; j <= i; j++) {
if (j == 0 || j == i) { //每行第1个和最后1个值为1
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; //计算和值,本行的值是上1行对应列的数与其前一个数相加的结果
}
}
}

  3.添加空格。每行的空格数为 lineCount- i - 1个,并输出

for (let i = 0; i < lineCount; i++) {
// 添加空格
nbsp = '';
for (let j = 0; j < lineCount - i - 1; j++) {
nbsp += ' ';
}
console.log(nbsp+arr[i])
}

完整的代码如下:

let readline = require('readline-sync');
console.log('请输入杨辉三角的行数:');
let line = ~~readline.question('');
// 1.先将杨辉三角做成如下形式
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 2.添加空格
// arr存储所有的数据
let arr = [],nbsp = '';
// 创建二维数组,每行作为1个数组保存
for (let i = 0; i < line; i++) {
arr[i] = new Array(i + 1);
}
for (let i = 0; i < line; i++) {
// 计算每个值装进数组中
for (let j = 0; j <= i; j++) {
if (j == 0 || j == i) {
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
}
for (let i = 0; i < line; i++) {
// 添加空格
nbsp = '';
for (let j = 0; j < line - i - 1; j++) {
nbsp += ' ';
}
console.log(nbsp+arr[i])
}

  

实际上这样实现还存在一个问题,当要输出的行过多的情况下,就会出现三角形逐渐偏斜的情况如下,影响美观。我暂未想到办法解决,若有兴趣的小伙伴想到办法可以留言探讨。

请输入杨辉三角的行数:
15 1
1.1
1.2.1
1.3.3.1
1.4.6.4.1
1.5.10.10.5.1
1.6.15.20.15.6.1
1.7.21.35.35.21.7.1
1.8.28.56.70.56.28.8.1
1.9.36.84.126.126.84.36.9.1
1.10.45.120.210.252.210.120.45.10.1
1.11.55.165.330.462.462.330.165.55.11.1
1.12.66.220.495.792.924.792.495.220.66.12.1
1.13.78.286.715.1287.1716.1716.1287.715.286.78.13.1
1.14.91.364.1001.2002.3003.3432.3003.2002.1001.364.91.14.1

  

js中实现杨辉三角的更多相关文章

  1. JS JavaScript实现杨辉三角

    1       1 1      1 2 1    1 3 3 1   1 4 6 4 1 1 5 10 10 5 1 ........ 观察这样的一组数,找出规律,用控制台输出这样规律的数 规律:这 ...

  2. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

  3. js实现杨辉三角

    杨辉三角是计算二项式乘方展开式的系数时必不可少的工具.是由数字排列而成的三角形数表. 资料:杨辉三角第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为 ...

  4. [py]函数中yield多次返回,延迟计算特性-杨辉三角

    搞清什么是杨辉三角 每行是一个数组, 第一行: [1] 第二行: [1, 1] 第三行: [1, 2, 2, 1] ... 画的好看点就是,不过没啥卵用 1 / \ 1 1 / \ / \ 1 2 1 ...

  5. C语言用一维数组打印杨辉三角(原:无意中想到)

    本贴地址 ] = { }; a[] = , a[] = ; int i, j,m; ; i <= ; i++) //2-11 输出10行 { ; j > ; j--) //关键在这句,倒着 ...

  6. JS:递归基础及范例——斐波那契数列 、 杨辉三角

    定义:程序调用自身的编程技巧称为递归.一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就 ...

  7. 杨辉三角 js 练习

    //打印杨辉三角a[[],[],[]] function fn(n){ //i=0 1 2 3.. var a = new Array(n); //行 1 2 3 4.. 创建二维数组. for(va ...

  8. [LeetCode] Pascal's Triangle II 杨辉三角之二

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  9. [LeetCode] Pascal's Triangle 杨辉三角

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

随机推荐

  1. Node.js 内置模块fs的readdir方法 查看某个文件夹里面包含的文件内容

    fs.readdir(path[, options], callback) 例: "use strict"; const fs = require("fs"); ...

  2. Python序列化模块pickle和json使用和区别

    这是用于序列化的两个模块: • json: 用于字符串和python数据类型间进行转换 • pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:d ...

  3. iOS 根据文字字数动态确定Label宽高

    iOS7中用以下方法 - (CGSize)sizeWithAttributes:(NSDictionary *)attrs; 替代过时的iOS6中的- (CGSize)sizeWithFont:(UI ...

  4. 【ZJOI2007】捉迷藏 小小的总结

    2019-01-09 22:56:33 终于终于把这道题目做掉了... 做了两个晚上..不知道为什么自己如此之笨.. 在洛谷上断断续续一共交了24次,感觉自己都要被封号了. 昨天花半个晚上从零开始研究 ...

  5. C 语言实例 - 一元二次方程

    C 语言实例 - 一元二次方程 求一元二次方程:ax2+bx+c= 的根. 输入三个实数a,b,c的值,且a不等于0. 实例 #include <stdio.h> #include < ...

  6. Codeforces 1175E(倍增)

    要点 与cf 1168C相似的一点都是看某点x最远能拓展到哪里 看数据想要在logn内查询,考虑倍增步数 const int maxn = 2e5 + 5, X = 5e5 + 5, LOG = 25 ...

  7. Codeforces 126B(kmp)

    要点 头尾的最长相同只要一个kmp即可得,于是处理中间部分 扫一遍记录一下前缀的每个位置是否存在一个中间串跟它相同,见代码 如果当前没有,接着用Next数组去一找即可 #include <cst ...

  8. missfresh问题记录

    一.基本信息 1.登陆机器    ssh lina02@mjump.missfresh.net -p2222 二.问题 1.分页问题:job_id为空时能查询出来(笛卡尔乘积),需要加上AND res ...

  9. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  10. 《深入理解java虚拟机》笔记(7)JVM调优(分代垃圾收集器)

    以下配置主要针对分代垃圾回收算法而言. 一.堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用 ...