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

20k views Asked by At

I'm having a little trouble with my attempt at this problem. Code Below:

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>");
}

It seems the problem hinges on assigning values to an array using an expression like myArray[1][1] = "foo"

I'm confused about this because I can do this: var myArray = []; myArray[4] = "foo" which seems to suggest that an element can be created at an arbitrary position in a 1 dimensional array, but not with 2 dimensions.

Any help with clearing up my misconceptions appreciated.

13

There are 13 answers

0
Logan R. Kearsley On BEST ANSWER

JavaScript doesn't have two-dimensional arrays. What it does have is arrays that happen to contain other arrays. So, yes, you can assign a value to any arbitrary position in an array, and the array will magically make itself big enough, filling in any gaps with 'undefined'... but you can't assign a value to any position in a sub-array that you haven't explicitly created yet. You have to assign sub-arrays to the positions of the first array before you can assign values to the positions of the sub-arrays.

Replacing

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

with

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

should do it. Assuming all of your indexing logic is correct, anyway. You've got some problems there, too, since your initial array only contains a single value, so result[row][col] = result[row - 1][col] + result[row - 1][col - 1]; is accessing at least one cell that has never been defined.

0
Robin Andrews On

Thanks Logan R. Kearsley. I have now solved it:

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>");
}
0
VIJAY P On

you can create Pascal's triangle using below code:

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)

0
akurudi On

This function will calculate Pascal's Triangle for "n" number of rows. It will create an object that holds "n" number of arrays, which are created as needed in the second/inner for loop.

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));
0
Akash Kriplani On

The Pascal's Triangle can be printed using recursion

Below is the code snippet that works recursively.

We have a recursive function pascalRecursive(n, a) that works up till the number of rows are printed. Each row is a element of the 2-D array ('a' in this case)

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

0
Selvam Annamalai On

Floyd triangle

You can try the following code for a Floyd triangle

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);
}
0
РАВИ On

You can create arbitrary 2d arrays and store it in there and return the correct Pascal. JavaScript does not have a special syntax for creating multidimensional arrays. A common workaround is to create an array of arrays in nested loops.

source

Here is my version of the solution

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;
 }
0
Deepak Dhull On

Here is the code i created for pascal triangle in 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)

Here is the link as well http://rextester.com/TZX59990

0
Ahmet Deveci On

This is my solve:

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);
1
ankit binjola On

here is the pattern for n = 3

      #

     ##

    ###

here is js code to print this.

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");
    }
}
0
Boualem Dairi On
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;
  }
}
1
Mahmoud Mosavi On
    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>");
    }
1
Ankita Sinha On

This is my take on this problem by gaining access to the previous row.

const generate = numRows => { const triangle = [[1]]

    for (let i = 1; i < numRows; i++) {
        // Previous row
        const previous = triangle[i - 1]
        // Current row
        const current = new Array(i + 1).fill(1)
        
        // Populate the current row with the previous
        // row's values
        for (let j = 1; j < i; j++) {
            current[j] = previous[j - 1] + previous[j]
        }
        
        // Add to triangle result
        triangle.push(current)
    }
    
    return triangle
}