如何在 Javascript 中编写 Pascal 三角形 - 混淆数组

How to program Pascal's Triangle in Javascript - confusion re Arrays

我在尝试解决这个问题时遇到了一些麻烦。代码如下:

function pasc(n){
var result = [[1]];
for (var row = 1; row < n; row++){
    for (var col = 1; col <= row; col++){
        result[row][col] = result[row - 1][col] + result[row - 1][col - 1];
    }
}
return result;
}
pasc(10)
for (var i = 0; i < result.length; i++){
    document.write(result[i]+"<br>");
}

看来问题在于使用 myArray[1][1] = "foo"

之类的表达式为数组赋值

我对此感到困惑,因为我可以这样做:var myArray = []; myArray[4] = "foo" 这似乎表明可以在一维数组中的任意位置创建一个元素,但不能在二维数组中创建。

如能帮助我消除误解,我将不胜感激。

JavaScript 没有二维数组。它所拥有的是恰好包含其他数组的数组。所以,是的,您可以为数组中的任意位置分配一个值,并且该数组会神奇地使自己足够大,用 'undefined' 填充任何空白...但是您 不能 为您尚未显式创建的子数组中的任何位置赋值。您必须先将子数组分配给第一个数组的位置,然后才能将值分配给子数组的位置。

正在替换

for (var row = 1; row < n; row++){
    for (var col = 1; col <= row; col++){

for (var row = 1; row < n; row++){
    result[row] = [];
    for (var col = 1; col <= row; col++){

应该这样做。无论如何,假设您所有的索引逻辑都是正确的。你在那里也遇到了一些问题,因为你的初始数组只包含一个值,所以 result[row][col] = result[row - 1][col] + result[row - 1][col - 1]; 正在访问至少一个从未定义的单元格。

感谢 Logan R. Kearsley。我现在已经解决了:

function pasc(n){
var result = [];
    result[0] = [1];
    result[1] = [1,1];
for (var row = 2; row < n; row++){
    result[row] = [1];
    for (var col = 1; col <= row -1; col++){
        result[row][col] = result[row-1][col] + result[row-1][col-1];
        result[row].push(1);
    }
}
return result;
}

for (var i = 0; i < pasc(10).length; i++){
    document.write(pasc(10)[i]+"<br>");
    console.log(pasc(10)[i]+"<br>");
}

您可以使用以下代码创建帕斯卡三角形:

function pascal(n) {
    var arr = [];
    if (n == 1) {
        arr[0] = [];
        arr[0][0] = 1;
    } else if (n == 2) {
        arr[0] = [];
        arr[0][0] = 1;
        arr[1] = [];
        arr[1][0] = 1;
        arr[1][1] = 1;
    } else if (n > 2) {
        arr[0] = [];
        arr[1] = [];
        arr[0][0] = 1;
        arr[1][0] = 1;
        arr[1][1] = 1;
        for (i = 2; i < n; i++) {
            arr[i] = [];
            arr[i][0] = 1;
            for (j = 1; j < i; j++) {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
            arr[i][j] = 1;
        }
    }
    console.log(arr);
    for (i = 0; i < arr.length; i++) {
        console.log(arr[i].join(' '))

    }
}

function pascal(n) {
    var arr = [];
    if (n == 1) {
        arr[0] = [];
        arr[0][0] = 1;
    } else if (n == 2) {
        arr[0] = [];
        arr[0][0] = 1;
        arr[1] = [];
        arr[1][0] = 1;
        arr[1][1] = 1;
    } else if (n > 2) {
        arr[0] = [];
        arr[1] = [];
        arr[0][0] = 1;
        arr[1][0] = 1;
        arr[1][1] = 1;
        for (i = 2; i < n; i++) {
            arr[i] = [];
            arr[i][0] = 1;
            for (j = 1; j < i; j++) {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
            arr[i][j] = 1;
        }
    }
    console.log(arr);
    for (i = 0; i < arr.length; i++) {
        console.log(arr[i].join(' '))

    }
}
pascal(5)

此函数将计算 "n" 行的帕斯卡三角形。它将创建一个包含 "n" 个数组的对象,这些数组是根据需要在 second/inner for 循环中创建的。

function getPascalsTriangle(n) {
    var arr = {};
    for(var row = 0; row < n; row++) {
        arr[row] = [];
        for(var col = 0; col < row+1; col++) {
            if(col === 0 || col === row) {
                arr[row][col] = 1;
            } else {
                arr[row][col] = arr[row-1][col-1] + arr[row-1][col];
            }         
        }       
    }   
    return arr;
}
console.log(getPascalsTriangle(5));

可以使用递归

打印帕斯卡三角形

下面是递归工作的代码片段。

我们有一个递归函数 pascalRecursive(n, a),它一直工作到打印行数为止。每行都是二维数组的一个元素(在本例中为 'a')

    var numRows = 10,
        triangle, 
        start, 
        stop;

    // N is the no. of rows/tiers 
    // a is the 2-D array consisting of the row content

    function pascalRecursive(n, a) {

      if (n < 2) return a; 

      var prevRow = a[a.length-1];
      var curRow = [1];

      for (var i = 1; i < prevRow.length; i++) {
        curRow[i] = prevRow[i] + prevRow[i-1];
      }
      curRow.push(1);
      a.push(curRow);

      return pascalRecursive(n-1, a); // Call the function recursively
    }


    var triangle = pascalRecursive(numRows, [[1]]);

    for(var i = 0; i < triangle.length; i++)
      console.log(triangle[i]+"\n");

弗洛伊德三角

您可以针对 Floyd 三角形尝试以下代码

var prevNumber=1,i,depth=10;

for(i=0;i<depth;i++){
    tempStr = "";j=0;
    while(j<= i){
        tempStr = tempStr + "    " + prevNumber;
        j++;
        prevNumber++;
    }
    console.log(tempStr);
}

您可以创建任意二维数组并将其存储在那里,return 正确的 Pascal。 JavaScript 没有用于创建多维数组的特殊语法。一个常见的解决方法是在嵌套循环中创建一个数组数组。

source

这是我的解决方案

function pascal(input) {
  var result = [[1], [1,1]];
  if (input < 0) {
    return [];
  }
  if (input === 0) {
      return result[0];
  }

  for(var j = result.length-1; j < input; j++) {
    var newArray = [];
    var firstItem = result[j][0]; 
    var lastItem = result[j][result[j].length -1]; 
    newArray.push(firstItem);

    for (var i =1; i <= j; i++) {      
      console.log(result[j][i-1], result[j][i]);
      newArray.push(sum(result[j][i-1], result[j][i]));
    }

    newArray.push(lastItem);

    result.push(newArray);
  }
  return result[input];
 }


 function sum(one, two) {
    return one + two;
 }

这是我在 javascript

中为帕斯卡三角形创建的代码
'use strict'
let noOfCoinFlipped = 5
let probabiltyOfnoOfHead = 2
var dataStorer = [];

for(let i=0;i<=noOfCoinFlipped;i++){
    dataStorer[i]=[];
    for(let j=0;j<=i;j++){
        if(i==0){
            dataStorer[i][j] = 1;
        }
        else{
            let param1 = (j==0)?0:dataStorer[i-1][j-1];
            let param2 = dataStorer[i-1][j]?dataStorer[i-1][j]:0; 
            dataStorer[i][j] = param1+param2;
      }
    }
}

let totalPoints = dataStorer[noOfCoinFlipped].reduce((s,n)=>{return s+n;})
let successPoints = dataStorer[noOfCoinFlipped][probabiltyOfnoOfHead];
console.log(successPoints*100/totalPoints)

这也是link http://rextester.com/TZX59990

这是我的解决方案:

function pascalTri(n){
    let arr=[];
    let c=0;
    for(let i=1;i<=n;i++){
        arr.push(1);
        let len=arr.length;
        if(i>1){
            if(i>2){
               for(let j=1;j<=(i-2);j++){
                    let idx=(len-(2*i)+j+2+c);
                    let val=arr[idx]+arr[idx+1];
                    arr.push(val);
                }
                c++;
            }
            arr.push(1);    
        }
    }
    return arr;
}

let pascalArr=pascalTri(7);

console.log(pascalArr);

这是 n = 3 的模式

      #

     ##

    ###

这里是打印这个的 js 代码。

function staircase(n) {
    for(var i=0 ; i<n ; i++) {
        for(var j=n-1 ; j>i ; j--)
            process.stdout.write(" ");

        for(var k=0 ; k<=i; k++) {
            process.stdout.write("#");
        }
        process.stdout.write("\n");
    }
}
class PascalTriangle {
  constructor(n) {
    this.n = n;
  }

  factoriel(m) {
    let result = 1;
    if (m === 0) {
      return 1;
    }
    while (m > 0) {
      result *= m;
      m--;
    }
    return result;
  }
  fill() {
    let arr = [];
    for (let i = 0; i < this.n; i++) {
      arr.push([]);
    }

    for (let i = 0; i < arr.length; i++) {
      for (let j = 0; j <= i; j++) {
        arr[i].push(this.factoriel(i) / (this.factoriel(j) * this.factoriel(i - j)));
      }
    }

    return arr;
  }
}
    var m = prompt("enter  number:");
    var arrMain = new Array();
    for (var i = 0; i < m; i++) {
        arrMain[i] = [];
    }
    for (var i = 0; i < m; i++) {
        if (i == 0) {
            arrMain[i] = [1];
        } else if (i == 1) {
            (arrMain[i]) = [1, 1];
        } else {
            for (var j = 0; j <= i; j++) {
                if (j == 0 || j == arrMain[i - 1].length) {
                    arrMain[i][j] = 1;
                } else {
                    arrMain[i][j] = arrMain[i - 1][j] + arrMain[i - 1][j - 1];
                }
            }
        }
        document.write(arrMain[i] + "<br>");
    }