برنامه محاسبه مثلث خیام پاسکال — راهنمای کاربردی
مثلث خیام پاسکال، آرایه مثلثی از ضرایب بسط دوجملهای است. به این مثلث، «مثلث خیام»، «مثلث-پاسکال»، «مثلث خیام-پاسکال-نیوتن»، «مثلث تارتالیا» (در زبان ایتالیایی) و «مثلث یانگ هویی» (در زبان چینی) نیز گفته میشود. دلیل وجود نامهای متعدد برای این مثلث آن است که دانشمندان گوناگون از نقاط مختلف جهان، شامل ایران، فرانسه، ایتالیا، چین، هند و آلمان، در برهههای مختلفی از تاریخ، مطالعاتی پیرامون این مثلث داشتهاند. در این مطلب، به روش ساخت برنامه محاسبه مثلث خیام و همچنین، چگونگی پیادهسازی آن در زبانهای برنامهنویسی گوناگون شامل ++C، «جاوا» (Java)، «پایتون» (Python)، «سیشارپ» (#C) و «پیاچپی» (PHP) پرداخته شده است. سطرهای مثلث پاسکال معمولا با آغاز از بالاترین سطر، به عنوان سطر شماره صفر (یعنی n = ۰) شمارش میشوند. ورودیهای هر سطر، از سمت چپ با آغاز از k = 0 شمارش میشوند و مقدار آنها وابسته به اعداد موجود در سطرهای مجاور است. یک مثلث خیام پاسکال را میتوان به صورت زیر ساخت.
در سطر صفر (بالاترین سطر)، یک ورودی یکتای غیر صفر یعنی یک (۱) وجود دارد. هر ورودی در سطرهای زیرین، با محاسبه مجموع عددهای بالایی از چپ به راست محاسبه میشود و موارد فاقد ورودی، صفر محسوب میشوند. برای مثال، مقدار اولیه در سطر اول (یا هر سطر دیگری) برابر با یک (۱) است (جاصل جمع صفر و یک). این در حالی است که به عنوان نمونه، در سطر سوم (n = 3)، یک و سه با یکدیگر جمع میشوند و مقدار ۴ را برای سطر بعدی (سطر چهارم) میسازند. در انیمیشن زیر، آنچه بیان شد را میتوان مشاهده کرد.
فرمول مثلث خیام پاسکال
ورودی سطر nاُم و ستون kاُم به صورت مشخص میشود. برای مثال، ورودی یکتای غیر صفر بالاترین سطر (سطر صفر و ستون صفر)، به صورت است. با توجه به این موضوع، میتوان روش محاسبه بیان شده در پاراگراف پیشین را به صورت زیر نوشت:
برای عدد صحیح غیر صفر n و عدد صحیح k بین ۰ تا n، رابطه بازگشتی بالا برای ضرایب چندجملهای برقرار است. به این فرمول، اتحاد پاسکال گفته میشود. اتحاد پاسال دارای تعمیم برای ابعاد بالاتر است. نسخه سهبُعدی مثلث خیام پاسکال را «هرم پاسکال» (Pascal's Pyramid) یا «چهار وجهی پاسکال» (Pascal's Tetrahedron) مینامند. نسخه تعمیم یافته را نیز «ساده پاسکال» (Pascal's Simplices) مینامند.
برنامه محاسبه مثلث خیام پاسکال
مثلث پاسکال یک آرایه مثلثی از ضرایب چندجملهای است. هدف نوشتن تابعی است که یک مقدار صحیح n را به عنوان ورودی دریافت و اولین n سطر مثلث پاسکال را چاپ کند. در ادامه، ۶ سطر اول مثلث پاسکال نمایش داده شدهاند.
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
روش اول با پیچیدگی زمانی از مرتبه (O(n3
با فرض آنکه سطرها از یک شروع میشوند (n = 1)، تعداد ورودیها در هر سطر برابر با شماره آن سطر است. برای مثال، اولین سطر دارای یک ورودی (۱) است؛ دومین سطر دو ورودی (1 1) و سومین سطر سه ورودی (1 2 1) دارد و همین قاعده برای سایر سطرها نیز صادق است. هر ورودی در یک سطر، مقدار ضریب دو جملهای (در بسط دو جملهای) است. مقدار iاُمین ورودی در سطر شماره line، برابر با (C(line, i است. مقدار را میتوان با استفاده از فرمول زیر محاسبه کرد.
یک راهکار ساده، اجرای دو حلقه و محاسبه مقدار ضریب چندجملهای در حلقه داخلی است.
محاسبه مثلث خیام پاسکال در ++C
1// C++ code for Pascal's Triangle
2#include <stdio.h>
3
4// See https://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/
5// for details of this function
6int binomialCoeff(int n, int k);
7
8// Function to print first
9// n lines of Pascal's
10// Triangle
11void printPascal(int n)
12{
13 // Iterate through every line and
14 // print entries in it
15 for (int line = 0; line < n; line++)
16 {
17 // Every line has number of
18 // integers equal to line
19 // number
20 for (int i = 0; i <= line; i++)
21 printf("%d ",
22 binomialCoeff(line, i));
23 printf("\n");
24 }
25}
26
27// See https://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/
28// for details of this function
29int binomialCoeff(int n, int k)
30{
31 int res = 1;
32 if (k > n - k)
33 k = n - k;
34 for (int i = 0; i < k; ++i)
35 {
36 res *= (n - i);
37 res /= (i + 1);
38 }
39
40 return res;
41}
42
43// Driver program
44int main()
45{
46 int n = 7;
47 printPascal(n);
48 return 0;
49}
محاسبه مثلث خیام پاسکال در جاوا
1// Java code for Pascal's Triangle
2import java.io.*;
3
4class GFG {
5
6 // Function to print first
7 // n lines of Pascal's Triangle
8 static void printPascal(int n)
9 {
10
11 // Iterate through every line
12 // and print entries in it
13 for (int line = 0; line < n; line++)
14 {
15 // Every line has number of
16 // integers equal to line number
17 for (int i = 0; i <= line; i++)
18 System.out.print(binomialCoeff
19 (line, i)+" ");
20
21 System.out.println();
22 }
23 }
24
25 // Link for details of this function
26 // https://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/
27 static int binomialCoeff(int n, int k)
28 {
29 int res = 1;
30
31 if (k > n - k)
32 k = n - k;
33
34 for (int i = 0; i < k; ++i)
35 {
36 res *= (n - i);
37 res /= (i + 1);
38 }
39 return res;
40 }
41
42 // Driver code
43 public static void main(String args[])
44 {
45 int n = 7;
46 printPascal(n);
47 }
48}
49
50/*This code is contributed by Nikita Tiwari.*/
محاسبه مثلث خیام پاسکال در پایتون
1# Python 3 code for Pascal's Triangle
2# A simple O(n^3)
3# program for
4# Pascal's Triangle
5
6# Function to print
7# first n lines of
8# Pascal's Triangle
9def printPascal(n) :
10
11 # Iterate through every line
12 # and print entries in it
13 for line in range(0, n) :
14
15 # Every line has number of
16 # integers equal to line
17 # number
18 for i in range(0, line + 1) :
19 print(binomialCoeff(line, i),
20 " ", end = "")
21 print()
22
23
24# See https://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/
25# for details of this function
26def binomialCoeff(n, k) :
27 res = 1
28 if (k > n - k) :
29 k = n - k
30 for i in range(0 , k) :
31 res = res * (n - i)
32 res = res // (i + 1)
33
34 return res
35
36# Driver program
37n = 7
38printPascal(n)
39
40
41# This code is contributed by Nikita Tiwari.
محاسبه مثلث خیام پاسکال در #C
1// C# code for Pascal's Triangle
2using System;
3
4class GFG {
5
6 // Function to print first
7 // n lines of Pascal's Triangle
8 static void printPascal(int n)
9 {
10
11 // Iterate through every line
12 // and print entries in it
13 for (int line = 0; line < n; line++)
14 {
15 // Every line has number of
16 // integers equal to line number
17 for (int i = 0; i <= line; i++)
18 Console.Write(binomialCoeff
19 (line, i)+" ");
20
21 Console.WriteLine();
22 }
23 }
24
25 // Link for details of this function
26 // https://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/
27 static int binomialCoeff(int n, int k)
28 {
29 int res = 1;
30
31 if (k > n - k)
32 k = n - k;
33
34 for (int i = 0; i < k; ++i)
35 {
36 res *= (n - i);
37 res /= (i + 1);
38 }
39 return res;
40 }
41
42 // Driver code
43 public static void Main()
44 {
45 int n = 7;
46 printPascal(n);
47 }
48}
49
50/*This code is contributed by vt_m.*/
محاسبه مثلث خیام پاسکال در PHP
1<?php
2// PHP implementation for
3// Pascal's Triangle
4
5// for details of this function
6function binomialCoeff($n, $k)
7{
8 $res = 1;
9 if ($k > $n - $k)
10 $k = $n - $k;
11 for ($i = 0; $i < $k; ++$i)
12 {
13 $res *= ($n - $i);
14 $res /= ($i + 1);
15 }
16return $res;
17}
18
19// Function to print first
20// n lines of Pascal's
21// Triangle
22function printPascal($n)
23{
24 // Iterate through every line and
25 // print entries in it
26 for ($line = 0; $line < $n; $line++)
27 {
28 // Every line has number of
29 // integers equal to line
30 // number
31 for ($i = 0; $i <= $line; $i++)
32 echo "".binomialCoeff($line, $i)." ";
33
34 echo "\n";
35 }
36}
37
38// Driver Code
39$n=7;
40printPascal($n);
41
42// This code is contributed by Mithun Kumar
43?>
خروجی
خروجی قطعه کدهای بالا برای n = 5 به صورت زیر است.
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
پیچیدگی زمانی این روش، برابر با (O(n3 است. در ادامه، روشهای بهینه شده نیز معرفی شدهاند.
روش ۲ با پیچیدگی زمانی از مرتبه (O(n2 و فضای اضافی (O(n2
با نگاهی دقیقتر به مثلث خیام، میتوان مشاهده کرد که هر ورودی، مجموع دو مقدار بالایی خودش است. بنابراین، میتوان آرایه دوبُعدی ساخت که مقادیر از پیش تولید شده را ذخیره میکند. برای تولید یک مقدار در یک خط، میتوان از مقادیری که پیشتر در آرایه ذخیره شدهاند استفاده کرد.
محاسبه مثلث خیام پاسکال در ++C
1// C++ program for Pascal’s Triangle
2// A O(n^2) time and O(n^2) extra space
3// method for Pascal's Triangle
4#include <bits/stdc++.h>
5using namespace std;
6
7void printPascal(int n)
8{
9
10 // An auxiliary array to store
11 // generated pscal triangle values
12 int arr[n][n];
13
14 // Iterate through every line and
15 // print integer(s) in it
16 for (int line = 0; line < n; line++)
17 {
18 // Every line has number of integers
19 // equal to line number
20 for (int i = 0; i <= line; i++)
21 {
22 // First and last values in every row are 1
23 if (line == i || i == 0)
24 arr[line][i] = 1;
25 // Other values are sum of values just
26 // above and left of above
27 else
28 arr[line][i] = arr[line - 1][i - 1] +
29 arr[line - 1][i];
30 cout << arr[line][i] << " ";
31 }
32 cout << "\n";
33 }
34}
35
36// Driver code
37int main()
38{
39 int n = 5;
40 printPascal(n);
41 return 0;
42}
43
44// This code is Contributed by Code_Mech.
محاسبه مثلث خیام پاسکال در C
1// C program for Pascal’s Triangle
2// A O(n^2) time and O(n^2) extra space
3// method for Pascal's Triangle
4void printPascal(int n)
5{
6// An auxiliary array to store
7// generated pscal triangle values
8int arr[n][n];
9
10// Iterate through every line and print integer(s) in it
11for (int line = 0; line < n; line++)
12{
13 // Every line has number of integers
14 // equal to line number
15 for (int i = 0; i <= line; i++)
16 {
17 // First and last values in every row are 1
18 if (line == i || i == 0)
19 arr[line][i] = 1;
20 // Other values are sum of values just
21 // above and left of above
22 else
23 arr[line][i] = arr[line-1][i-1] + arr[line-1][i];
24 printf("%d ", arr[line][i]);
25 }
26 printf("\n");
27}
28}
29// Driver code
30int main()
31{
32int n = 5;
33 printPascal(n);
34 return 0;
35}
محاسبه مثلث خیام پاسکال در جاوا
1// java program for Pascal's Triangle
2// A O(n^2) time and O(n^2) extra
3// space method for Pascal's Triangle
4import java.io.*;
5
6class GFG {
7 public static void main (String[] args) {
8 int n = 5;
9 printPascal(n);
10 }
11
12public static void printPascal(int n)
13{
14// An auxiliary array to store generated pascal triangle values
15int[][] arr = new int[n][n];
16
17// Iterate through every line and print integer(s) in it
18for (int line = 0; line < n; line++)
19{
20 // Every line has number of integers equal to line number
21 for (int i = 0; i <= line; i++)
22 {
23 // First and last values in every row are 1
24 if (line == i || i == 0)
25 arr[line][i] = 1;
26 else // Other values are sum of values just above and left of above
27 arr[line][i] = arr[line-1][i-1] + arr[line-1][i];
28 System.out.print(arr[line][i]);
29 }
30 System.out.println("");
31}
32}
33}
محاسبه مثلث خیام پاسکال در #C
1// C# program for Pascal's Triangle
2// A O(n^2) time and O(n^2) extra
3// space method for Pascal's Triangle
4using System;
5
6class GFG
7{
8public static void printPascal(int n)
9{
10
11// An auxiliary array to store
12// generated pascal triangle values
13int[,] arr = new int[n, n];
14
15// Iterate through every line
16// and print integer(s) in it
17for (int line = 0; line < n; line++)
18{
19 // Every line has number of
20 // integers equal to line number
21 for (int i = 0; i <= line; i++)
22 {
23
24 // First and last values
25 // in every row are 1
26 if (line == i || i == 0)
27 arr[line, i] = 1;
28 else // Other values are sum of values
29 // just above and left of above
30 arr[line, i] = arr[line - 1, i - 1] +
31 arr[line - 1, i];
32 Console.Write(arr[line, i]);
33 }
34Console.WriteLine("");
35}
36}
37
38// Driver Code
39public static void Main ()
40{
41 int n = 5;
42 printPascal(n);
43}
44}
45
46// This code is contributed
47// by Akanksha Rai(Abby_akku)
محاسبه مثلث خیام پاسکال در PHP
1<?php
2// PHP program for Pascal’s Triangle
3// A O(n^2) time and O(n^2) extra space
4// method for Pascal's Triangle
5function printPascal($n)
6{
7 // An auxiliary array to store
8 // generated pscal triangle values
9 $arr = array(array());
10
11 // Iterate through every line and
12 // print integer(s) in it
13 for ($line = 0; $line < $n; $line++)
14 {
15 // Every line has number of integers
16 // equal to line number
17 for ($i = 0; $i <= $line; $i++)
18 {
19 // First and last values in every row are 1
20 if ($line == $i || $i == 0)
21 $arr[$line][$i] = 1;
22
23 // Other values are sum of values just
24 // above and left of above
25 else
26 $arr[$line][$i] = $arr[$line - 1][$i - 1] +
27 $arr[$line - 1][$i];
28 echo $arr[$line][$i] . " ";
29 }
30 echo "\n";
31 }
32}
33
34// Driver code
35$n = 5;
36printPascal($n);
37
38// This code is contributed
39// by Akanksha Rai
40?>
خروجی
خروجی قطعه کد بالا برای n = 5 به صورت زیر است.
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
روش بیان شده را میتوان به نوعی بهینه کرد که از فضای اضافی (O(n استفاده کند. این کار را میتوان با توجه به این موضوع انجام داد که برای محاسبه مقادیر یک سطر، تنها نیاز به مقادیر سطر پیشین آن است. بنابراین، میتوان یک آرایه با اندازه n را ساخت و مقادیر را بازنویسی کرد. در ادامه، راهکار دیگری ارائه شده که تنها از فضای اضافی (O(1 استفاده میکند.
روش ۳ با پیچیدگی زمانی (O(n2 و فضای اضافی (O(1
این روش، بر مبنای روش اول است. چنانکه پیشتر بیان شد، ورودیهای سطر iاُم در سطر شماره line، ضرایب چندجملهای (C(line, i هستند و همه سطرها با مقدار ۱ شروع میشوند. هدف محاسبه (C(line, i با استفاده از (C(line, i-1 است. این مقدار را میتوان در زمان (O(1 با استفاده از روش زیر محاسبه کرد.
C(line, i) = line! / ( (line-i)! * i! ) C(line, i-1) = line! / ( (line - i + 1)! * (i-1)! ) میتوان رابطه زیر را از دو رابطه بالا نتیجه گرفت. C(line, i) = C(line, i-1) * (line - i + 1) / i بنابراین، (C(line, i را میتوان با استفاده از (C(line, i-1 در زمان (O(1 محاسبه کرد.
محاسبه مثلث خیام پاسکال در ++C
1// C++ program for Pascal’s Triangle
2// A O(n^2) time and O(1) extra space
3// function for Pascal's Triangle
4#include <bits/stdc++.h>
5
6using namespace std;
7void printPascal(int n)
8{
9
10for (int line = 1; line <= n; line++)
11{
12 int C = 1; // used to represent C(line, i)
13 for (int i = 1; i <= line; i++)
14 {
15
16 // The first value in a line is always 1
17 cout<< C<<" ";
18 C = C * (line - i) / i;
19 }
20 cout<<"\n";
21}
22}
23
24// Driver code
25int main()
26{
27 int n = 5;
28 printPascal(n);
29 return 0;
30}
31
32// This code is contributed by Code_Mech
من میخام بدونم که چطوری ی ایف بنویسم برای اینکه بفهمم ی عدد به اعداد مشخصی توی این مثلث تکرار شده یا نه . اگه بخام بهتر بگم : ما میدونیم عدد 1 بیشتر از هشت بار تکرار شده . الان میخایم بدونیم که ایا عدد دیگری وجود دارد مثل یک که بیش از 8 بار توی ایم مثلث اومده باشه؟ کدش رو چطوری بنویسیم . میشه برام توضیح بدید و کدش رو برام بزارید تو جواب(کپی پیست کنید مشکلی نداره بیشتر توضیحش مهمه)
و اینکه شما چقدر باهوش هستین که این کدو نوشتین خیلی کار عجیبیه . ولی خب من کلاس نهم هستم و قطعا توی درس های ما نیست . خیلی ازتون ممنونم .