DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/)
-   Legacy and Other Languages (http://www.daniweb.com/forums/forum42.html)
-   -   Pascal's Triangle (http://www.daniweb.com/forums/thread67082.html)

Maddy1987 Jan 12th, 2007 5:38 am
Pascal's Triangle
 





Coefficients in the expansion of (x+y)^n form a pattern which is useful for small values of n. It is known as Pascal's triangle.

n Pascal's triangle
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1

Write a Matlab script to calculate and display this expression in the form of the triangle for the first 10 values of n. Use the sprintf command to display in a suitable format such as that shown above.





% A Program for Pascal's Triangle

if nargin ~=2
n=1:10;
s=4;
end

if n<55
a= n/10;
x=0;
y=0;
x2=0;
w=1;


hold on;

for m = 1:n-1
x = x2-a/2;
y = y-a/2*sqrt(2);
w = 1;

x2 = x;

for l = 1:m
x = x+a;
w = nchoosek(m,1);

end
end

else clf;
text(-0.2,0.5,' FontSize',23);
end;

hold off;
axis square;
axis equal;
axis off;


I had tried the question but i am not getting through it can any1 help me out in this problem.

iamthwee Jan 14th, 2007 7:36 am
Re: Pascal's Triangle
 
Try to plan out a flow chart first.

saurabh41_scs Apr 13th, 2008 2:34 pm
Re: Pascal's Triangle
 
Quote:

Originally Posted by Maddy1987 (Post 300519)



Coefficients in the expansion of (x+y)^n form a pattern which is useful for small values of n. It is known as Pascal's triangle.

n Pascal's triangle
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1

Write a Matlab script to calculate and display this expression in the form of the triangle for the first 10 values of n. Use the sprintf command to display in a suitable format such as that shown above.





% A Program for Pascal's Triangle

if nargin ~=2
n=1:10;
s=4;
end

if n<55
a= n/10;
x=0;
y=0;
x2=0;
w=1;


hold on;

for m = 1:n-1
x = x2-a/2;
y = y-a/2*sqrt(2);
w = 1;

x2 = x;

for l = 1:m
x = x+a;
w = nchoosek(m,1);

end
end

else clf;
text(-0.2,0.5,' FontSize',23);
end;

hold off;
axis square;
axis equal;
axis off;


I had tried the question but i am not getting through it can any1 help me out in this problem.


hello i want to write code for this
in my opinion pascal triangle is:-
1
1 1
1 2 1
1 3 3 1

u wil find this by following prog:-
/*Program to Calculate the Pascal triangle */
#include<stdio.h>
int main()
{
int a[20][20];
int i,j,c,n,k;
printf("Enter how many lines do you want");
scanf("%d",&n);
a[1][1]=1;
a[2][1]=1;a[2][2]=1;
for(i=1;i<=n;i++)
{ for(j=1;j<=n-i;j++)
printf(" ");
if(i<3)
{
for(k=1;k<=i;k++)
{
printf("%d ",a[i][k]);
}
printf("\n");
}
else
{
a[i][1]=1;
printf("%d ",a[i][1]);
j=2;c=3;
while(j<i)
{
a[i][j]=a[i-1][c-2]+a[i-1][c-1];
printf("%d ",a[i][j]);
c=c+1;
j=j+1;
}
a[i][j]=1;
printf("%d\n ",a[i][j]);
}
}
getche();
}

DevonMcC++ Apr 28th, 2008 8:10 pm
Re: Pascal's Triangle
 
These seem rather elaborate in comparison to something like (in J):
Pascal =: i. !/ i.

See http://www.jsoftware.com/jwiki/NYCJUG/Projects/Pascal or http://www.jsoftware.com/jwiki/Essays/Pascal's_Triangle for more.

sarehu May 5th, 2008 10:28 pm
Re: Pascal's Triangle
 
That's because J is deliberately cryptic and hides all the hard work behind pre-written combinators and functions, in this case ! being "choose". Given the equivalent of these two defined in Haskell:

comb n k = foldl' (\x y -> ((n - x + 1) * y) `div` x) 1 [1..k]

table f xs ys = foldr ((:) . (`map` ys) . f) [] xs

Then producing Pascal's triangle is as simple as
join (table comb) [0..]
.

But overall a much simpler solution is
iterate (\xs -> zipWith (+) (0:xs) (xs++[0])) [1]

DevonMcC++ May 9th, 2008 8:59 am
Re: Pascal's Triangle
 
I suppose anything is cryptic if you make no effort to understand it.

Even so, your statement is very odd. Apparently you are under the mis-apprehension that your failure to understand is the fault of a succinct, powerful notation and this means that the language was "deliberately" designed to be hard to understand.

Why would you even think something like this? I mean, why would someone deliberately make something difficult to understand? Most people I know strive for clarity. Do you think that "1+1" is cryptic because it uses a symbol "+" instead of the word "plus"? I suppose it is if you don't know math.

The other odd thing you seem to imply is that avoiding hard, unnecessary work is a bad thing. So, you're against the idea of carefully designed, well-tested, powerful, pre-written functions that you can combine in a clear, logically consistent manner?

This is all the more puzzling as your initial answer
join (table comb) [0..]
apparently very closely resembles the J solution of
 i. !/ i. 
because each "i." generates a vector of consecutive integers and "/" - similarly to (table comb) - combines these vectors in a table using "!". The "!" function, with a right and left arguments x and y returns the number of ways x things can be chosen from y possibilities - pretty much a direct statement of what you are doing when determining the coefficient of a polynomial expansion.

There are, of course other ways to do this more algorithmically and less mathematically as you appear to show in your final example. I say "appear" because that example is rather cryptic insofar as it uses the pre-written function "zipWith".

In J, I could write something I presume is similar to this:
   pascalNewRow=: 3 : '1,(2+/\y),1'  
based on the following rule for generating a new row of the triangle from the previous one: start and end with 1; add together adjacent pairs for the middle section. The above expression "2+/\" adds together each adjacent 2 numbers across the first dimension of an array; the "3 :" defines a function. Once you know that, the code is a straightforward expression of the rule.

Similarly to the final expression in Haskell, we iterate the function "pascalNewRow" by using an iterator expressed by some symbols, "^:" instead of the word "iterate". So, the expression
   pascalNewRow^:10 ] 1 
returns the first ten rows of Pascal's triangle (starting with a "seed" of 1).

I find this much less cryptic than the Haskell expression but, of course, I've made the effort to understand it.

In any case, this has wandered far off topic. Why don't I conclude by giving a solution to the original problem? Taking my J code as a template, start by defining a function to add adjacent pairs of a vector:
int *addAdjacentPairs( int vlen, int *vec)
{  int vc, win2[2];
    win2[0]=0;
    win2[1]=vec[0];
    for(vc=0;vc<=vlen;vc++)
    {  vec[vc]=win2[0]+win2[1];
        win2[0]=win2[1];
        win2[1]=vec[vc+1];
    }
// Danger: returned vector is 1 longer than input: allocate accordingly.
    return 0;
}
and simply use it in a loop:
// PascalTriangle.c: print some rows of Pascal's triangle.

#include<stdio.h>

int main(void)
{  int vec[21];
    int ii,vc,nn;
    printf("How many lines (up to 20) do you want? ");
    scanf("%d",&nn);
// Should verify result and handle errors but this is why I don't like these
// languages that don't handle arrays natively so I won't bother.
    printf("\n");

    for(ii=0;ii<nn;ii++)
    {  vec[ii]=1;
        for(vc=0;vc<=ii;vc++) printf("%i ",vec[vc]);
        printf("\n");
        addAdjacentPairs( ii, vec);
    }
    return 0;
}

This provides a nice example of how solving the problem with a high-level notation leads to a more elegant solution even in a lower-level language.

Quote:

Originally Posted by sarehu (Post 600413)
That's because J is deliberately cryptic and hides all the hard work behind pre-written combinators and functions, in this case ! being "choose". Given the equivalent of these two defined in Haskell:

comb n k = foldl' (\x y -> ((n - x + 1) * y) `div` x) 1 [1..k]

table f xs ys = foldr ((:) . (`map` ys) . f) [] xs

Then producing Pascal's triangle is as simple as
join (table comb) [0..]
.

But overall a much simpler solution is
iterate (\xs -> zipWith (+) (0:xs) (xs++[0])) [1]



All times are GMT -4. The time now is 3:19 am.

Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC