E D R , A S I H C RSS

Pascal Triangle

ŒŒŠคนผ˜ ‚ผ๊ฐ˜• •Œ๊ณ ฆฌฆ˜

  • ฉฐน  „— งˆ๊ฐœ žฃŒ๊ตฌกฐ˜ ฒซฒˆงธ ˆ™ œ˜€ฃ ? ‹คฅธ ถ„“ค„ ‹ค๊ฒŒ งœ‹  ถ„ žˆœผ‹œ‹ค „œกœ ˜๊ฒฌ„ ‚˜ˆ  •˜œผ •‹ˆ‹ค.

žฌ๊ท€ ˜ธถœ„ šฉ•œ ฐฉ• - by ธˆ˜

~cpp 
const int pas(const int &m,const int &n)
{
    if(m==n || n==1) // –‰๊ณผ — ๊ฐ™๊ฑฐ‚˜(๊ฐ€žฅ ˜คฅธ๊ฑฐ‚˜) — 1ผ•ŒŠ” 1ถœ ฅ
        return 1;
    else
        return pas(m-1,n-1)+pas(m-1,n); // žฌ๊ท€˜ธถœ
}

  • ‹œŠ” ฐ”™€ ๊ฐ™.. กธผ ๊ฐ„‹จ•‹ˆ‹ค.
  • but.. ˆซž๊ฐ€ กฐ๊ธˆงŒ  ธ„.. ๊ต‰žฅžˆ ˜คž˜ ๊ฑธฆฝ‹ˆ‹ค. 01•™ฒˆ „ ˜ธ๊ตฐ 32–‰  •„ฅผ „ฃ–„•Œ ๊ฑธฆฐ ‹œ๊ฐ„€ 100ˆ๊ฐ€ „˜—ˆ‹ค •‹ˆ‹ค. žฌ๊ท€˜ธถœ..  ˆ˜ žˆœผ “ฐ€ ™‹œ‹ค.
  •  •Œ๊ณ ฆฌฆ˜€ ‹œ๊ฐ„„ ฌƒ•˜„œ ๊ณต๊ฐ„„ ค„ธ •Œ๊ณ ฆฌฆ˜๊ฒ ฃ ?
  • ’คฅผ ณผ๊ฒƒ„ —† ผ๊€ ธ •Œ๊ณ ฆฌฆ˜ -- „ ˜ธ.

recursive -zennith

~cpp 
unsigned long int P(int row, int col) {
	/* —˜ ๊ฐ’ –‰‹ค  ๊ฒฝšฐ ข…ฃŒ */
	if(row < col)
		exit(0);

	/* ฃผ–ง„ ๊ฐ’„ ๊ฒ€‚ฌ•˜—ฌ, ฒซฒˆงธ — 1๊ฑฐ‚˜ –‰๊ณผ — ๊ฐ™€๊ฒฝšฐ 1„ ฆฌ„ */
	if(col == 1 || row == col)
		return 1;

	/* ๊ทธ ‡€ •Š€ ๊ฒฝšฐ –‰๊ณผ —„ 1”ฉ ๊ฐ†Œ•„œ žฌ๊ท€ ˜ธถœ•œ ๊ฐ’๊ณผ
	–‰งŒ 1 ๊ฐ†Œ‹œผœ žฌ๊ท€ ˜ธถœ•œ ๊ฐ’„ ”•„œ ฆฌ„ */
	return P(--row, --col) + P(row, ++col);
}

  • ‹จˆœžˆ ”„ฆฐŠธฌผ˜ ‚šฉ„ ˜ฎ๊ฒผ„ ฟ..

™  ฐฐ—„ šฉ•œ ฐฉ• - by ธˆ˜

~cpp 
typedef unsigned long ulong;

ulong Pascal_Triangle(int m,int n)
{
	ulong **Array=new ulong*[m];	// 2ฐจ› ™  ฐฐ— • ‹น

	for(int i=0;i<m;i++)
		Array[i]=new ulong[i+1];	// n–‰—Š” n๊ฐœ˜ —งŒ • ‹น˜๊ฒŒ

	for(i=0;i<m;i++)
	{
		for(int j=0;j<=i;j++)
		{
			if(i==j || j==0)		// –‰๊ณผ — ๊ฐ™๊ฑฐ‚˜ — 1ผ•Œ
				Array[i][j]=1;		// (ฐฐ—€ 0€„ฐ ‹œž‘•˜€กœ 0ผ–ˆŒ) 1˜ ๊ฐ’„ คŒ
			else
				Array[i][j]=Array[i-1][j-1]+Array[i-1][j];
						// ๊ทธ ™˜ ๊ฒฝšฐ—Š” ๊ณต‹„ ”ฐฅธ‹ค.
		}
	}

	ulong return_value=Array[m-1][n-1];
	// ›•˜Š” ๊ฐ’ ฆฌ„(—ญ‹œ ฐฐ—€ 0€„ฐ ‹œž‘•˜€กœ •˜‚˜”ฉ นผ„œ)

	if(Array)	// Array 2ฐจ› ฐฐ— • ‹น˜—ˆ„•Œ
	{
		for(i=0;i<m;i++)
		{
			if(Array[i])
				delete [] Array[i];		// €›Œ €‹ค.(—)
		}
	}

	delete [] Array;		// €›Œ €‹ค.(–‰)

	return return_value;
}

  • ”ฑ ๊ธฐ—„ žฌ๊ท€˜ธถœ‹คŠ” ณตžก•˜ฃ ?
  • ๊ทธŸฐฐ.. †„Š” ™•‹คžˆ น ฆ…‹ˆ‹ค. ‡ฐฑ„ „ฃ–„ ฆ‰‹œฆ‰‹œ ‚˜˜คŠ”..
  •  •Œ๊ณ ฆฌฆ˜€ ฉ”ฆฌฅผ ” “ฐ„œ †„ฅผ ‚ฆฐ ฐฉ•๊ฒ ฃ ?
  • žฐ”กœ งœ € ” ‰ฌšธ๊ฑฐ ๊ฐ™„ค—ฌ. ฉ”ฆฌ ƒˆŠ”๊ฑธ ๊ฑฑ ••˜€ •Š•„„ ˜‹ˆ..
  • ‹คฅธ ข‹€ ฐฉ• žˆœผ‹œ —ฌ๊ธฐ‹ค  –ฃผ‹œ๊ธฐ ฐ”ž‹ˆ‹ค.
  • ใ…ก.ใ…ก ๊ฐ€..๊ฐ™‹ค.. --„ ˜ธ

dynamic allocation -zennith

~cpp 
int P(int row, int col) {
	/* €ˆ˜ „ –ธ€ */
	int i, j, temp;

	/* —ฐ‚ฐ„ œ„• ค‘  •ˆ˜˜• ฌธ„ฐ „ –ธ */
	int ** buffer;

	/* — –‰‹ค  ๊ฒฝšฐ ข…ฃŒ */
	if(col > row)
		exit(0);

	/* buffer— –‰งŒผ˜  •ˆ˜ฌธ„ฐ˜•„ • ‹นฐ›•„ Œ€ž… */
	buffer = malloc( row * sizeof(int *) );

	for(i = 0; i < row; i++) {
		/* ๊ฐ๊ฐ˜  •ˆ˜ ฌธ„ฐ—  •ˆ˜ ฐฐ—„ • ‹น•œ‹ค */
		*(buffer + i) = (int *)malloc( (i + 1) * sizeof(int) );

		/* • ‹น„ ‹คŒจ–ˆ„ •Œ */
		if(*(buffer + i) == NULL) {

			/* จผ € —ฌƒœ๊นŒ€ • ‹น•œ  •ˆ˜ ฐฐ—„ ฐ˜™˜ •˜๊ณ  */
			for(j = 0; j <= i; j++) {
				free(*(buffer + j));
			}

			/*  •ˆ˜ ฌธ„ฐ ฐฐ—„ ฐ˜™˜ •œ ›„ */
			free(buffer);

			/* ข…ฃŒ•œ‹ค */
			exit(0);
		}
	}

	/* —ฐ‚ฐ€ */
	for(i = 0; i < row; i++) {
		for(j = 0; j <= i; j++) {
			/* — 1๊ฑฐ‚˜ –‰๊ณผ — ๊ฐ™€ ๊ฒฝšฐ, 1„ Œ€ž… •œ‹ค */
			if(j == 0 || j == i) {
				*(*(buffer + i) + j) = 1;
				continue;
			}

			/* ๊ทธ ‡€ •Š€ ๊ฒฝšฐ  „ –‰(i - 1)  „ —(j - 1)˜ ๊ฐ’๊ณผ,
			 „ –‰(i - 1) ™ —(j) ˜ ๊ฐ’„ ”•„œ Œ€ž…•œ‹ค */
			*(*(buffer + i) + j) =
				*(*(buffer + i - 1) + j - 1) + *(*(buffer + i - 1) + j);
		}
	}

	/* ๊ณ„‚ฐ•œ ๊ฒฐ๊ณผ๊ฐ’„ ž„‹œ€ˆ˜—  €žฅ•œ‹ค */
	temp = *(*(buffer + row - 1) + col - 1);

	/* จผ €  •ˆ˜ ฐฐ—„ ฐ˜™˜•˜๊ณ  */
	for(i = 0; i < row; i++)
		free(*(buffer + i));

	/*  •ˆ˜ ฌธ„ฐ ฐฐ—„ ฐ˜™˜•œ‹ค */
	free(buffer);

	/* ž„‹œ€ˆ˜—  €žฅ•œ ๊ฐ’„ ฆฌ„ */
	return temp;
}

  • •„ง ๊ฐœ„ •   •œ ‘ ๊ตฐฐ žˆŠ”ฐ.. ๊ตฌ€ —ฌ๊ธฐ— ˜ฌฆฐ œ Š”  €๊ฒŒ Null pointer assignment —Ÿฌ๊ฐ€ ‚˜„œ.. —Ÿฌ‚œ๊ฑธ ™œ ˜ฌฆฌŠ”ฐ. ผ๊ณ  •˜‹œ • ง —†€งŒ.. ˜น‹œ ˜œ•ˆœผกœ ‹œ›•˜๊ฒŒ ฐ”Ÿฌฃผ‹ค ถ„ € •ฃผ‹œ ๊ฐ‚ฌ•˜๊ฒ Šต‹ˆ‹ค.
  • •๊ฒฐ–ˆŠต‹ˆ‹ค. ฌธ œ —† Œ•„๊ฐ€Š”๊ตฐš”.. —ญ‹œ ฌธ„ฐŠ” – ต๊ณ  – ค›Œผ..

ฒซค„€„ฐ ญ‰ ๊ณ„‚ฐ•˜Š” ฐฉ•

~cpp 
// ฒซ–‰€„ฐ n–‰๊นŒ€ ๊ณ„‚ฐ•˜Š” ฐฉ•„ †ต•
// ŒŒŠคนผ˜ ‚ผ๊ฐ˜•˜ n–‰ m—˜ ๊ฐ’„ ๊ตฌ•˜Š” •ˆ˜ (34–‰ ๊นŒ€ ๊ณ„‚ฐ ๊ฐ€Šฅ)
unsigned long PascalTriangle1(int n, int m)
{
	if(n<0 || n>35 || m<0 || m>n)	// –‰๊ณผ —˜ ๊ฐ’ ž˜œ๊ฒฝšฐ 0„ ฆฌ„
		return 0;
	if(n==1 || n==2)	// 1–‰ ˜Š” 2–‰€ ‘ 1 €กœ 1„ ฆฌ„
		return 1;

    // 2๊ฐœ˜ ฐฐ—„ ‚ฌšฉ•˜—ฌ ๊ณ„‚ฐ„ •œ‹ค
	// •˜‚˜˜ ฐฐ—— 2–‰„  €žฅ•œ ›„
	// ๊ทธ ฐฐ—„ ‚ฌšฉ• 3–‰„ ๊ณ„‚ฐ• ‚˜จธ€ ฐฐ——  €žฅ•˜๊ณ 
	// ‹ค‹œ 3–‰  €žฅœ ฐฐ—„ ‚ฌšฉ• 4–‰„ ๊ณ„‚ฐ•„œ
	// 2–‰  €žฅ˜– žˆ˜ ฐฐ——  €žฅ•˜๊ณ 
	// ๊ณ„† ™€๊ฐ™€ ‹œผกœ n–‰ ๊นŒ€ ๊ณ„‚ฐ•œ‹ค

	unsigned long *row[2];	// 2๊ฐœ˜ ฐฐ—˜ ฌธ„ฐ
	row[0]=new unsigned long[40];	// ตœŒ€ 40—๊นŒ€  €žฅ•  ˆ˜ žˆ„ก ฉ”ฆฌ • ‹น
	row[1]=new unsigned long[40];
	row[0][0]=row[0][1]=1;	// 2–‰„  €žฅ•œ‹ค
	int current=0;	// 2๊ฐœ˜ ฐฐ— ค‘ ๊ณ„‚ฐค‘ธ ฐฐ—„ ‚˜ƒ€‚Š” €ˆ˜

	for(int i=3;i<=n;i++)	// 3–‰€„ฐ n–‰๊นŒ€ ๊ณ„‚ฐ
	{
		current=!current;	// ๊ณ„‚ฐ•  ฐฐ—„ ฐ”๊ฟˆ

		row[current][0]=1;	// ฒซฒˆงธ —€ •ƒ 1
		row[current][i-1]=1;	// งˆ€ง‰ —„ •ƒ 1

		for(int j=1;j<i-1;j++)	// ‚˜จธ€ —„ ๊ณ„‚ฐ
			row[current][j]=row[!current][j-1]+row[!current][j];
	}

	// n–‰ m—˜ ๊ฐ’„ €
	unsigned long temp=row[current][m-1];
	delete[] row[0];	// • ‹น–ˆ˜ ฉ”ฆฌ • œ
	delete[] row[1];
	return temp;	// €•‘” n–‰ m—˜ ๊ฐ’„ ฆฌ„
}

กฐ•˜ ˆ˜ฅผ šฉ•œ ฐฉ•

~cpp 
// กฐ•˜ ˆ˜ฅผ ๊ณ„‚ฐ•˜Š” ฐฉ•„ †ต•
// ŒŒŠคนผ˜ ‚ผ๊ฐ˜•˜ n–‰ m—˜ ๊ฐ’„ ๊ตฌ•˜Š” •ˆ˜ (17–‰๊นŒ€ ๊ณ„‚ฐ ๊ฐ€Šฅ)
unsigned long PascalTriangle2(int n, int m)
{
	if(n<0 || n>18 || m<0 || m>n)	// –‰๊ณผ —˜ ๊ฐ’ ž˜œ ๊ฒฝšฐ 0„ ฆฌ„
		return 0;
	if(n==1 || n==2)	// 1–‰ ˜Š” 2–‰€ ‘ 1 €กœ 1„ ฆฌ„
		return 1;
	// 5–‰ 1—๊ณผ 5–‰ 5—, 5–‰ 2—๊ณผ 5–‰ 4— “ฑ€
	// ๊ฐ’ ๊ฐ™€งŒ 5–‰ 1—‚˜, 5–‰ 2— ๊ณ„‚ฐ ๊ฐ„‹จ•˜—ฌ
	// ๊ณ„‚ฐค‘— ˜คฒ„”Œกœšฐ๊ฐ€ ผ–‚˜Š” ๊ฒฝšฐฅผ ค„ผˆ˜ žˆ–
	// ”šฑ งŽ€ –‰„ ๊ณ„‚ฐ•  ˆ˜ žˆ‹ค
	// 5–‰ 5—‚˜, 5–‰ 4—๊ณผ ๊ฐ™€ ๊ฒƒ„ 5–‰ 1—‚˜, 5–‰ 2—กœ
	// ฐ”๊ฟ”„œ ‹ค‹œ ˜ธถœ•ฃผŠ” €ถ„‹ค
	if(m>n/2+n%2)
		return PascalTriangle2(n,n-m+1);

	unsigned long x=1,y=1, p;

    // (n-1)!/((n-1)-(m-1))! „ ๊ณ„‚ฐ
	p=n-1;
	for(int i=0;i<m-1;i++)
	{
		x*=p;
		p--;
	}

	// (m-1)! „ ๊ณ„‚ฐ
	for(p=m-1;p>=2;p--)
		y*=p;

	return x/y;	// (n-1)!/(((n-1)-(m-1))!*(m-1)!) „ ฆฌ„
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:00
Processing time 0.0149 sec