برنامه محاسبه مثلث خیام پاسکال — راهنمای کاربردی

۱۱۵۹۷ بازدید
آخرین به‌روزرسانی: ۲۰ آذر ۱۴۰۱
زمان مطالعه: ۱۲ دقیقه
دانلود PDF مقاله
برنامه محاسبه مثلث خیام پاسکال — راهنمای کاربردیبرنامه محاسبه مثلث خیام پاسکال — راهنمای کاربردی

مثلث خیام پاسکال، آرایه مثلثی از ضرایب بسط دوجمله‌ای است. به این مثلث، «مثلث خیام»، «مثلث-پاسکال»، «مثلث خیام-پاسکال-نیوتن»، «مثلث تارتالیا» (در زبان ایتالیایی) و «مثلث یانگ هویی» (در زبان چینی) نیز گفته می‌شود. دلیل وجود نام‌های متعدد برای این مثلث آن است که دانشمندان گوناگون از نقاط مختلف جهان، شامل ایران، فرانسه، ایتالیا، چین، هند و آلمان، در برهه‌های مختلفی از تاریخ، مطالعاتی پیرامون این مثلث داشته‌اند. در این مطلب، به روش ساخت برنامه محاسبه مثلث خیام و همچنین، چگونگی پیاده‌سازی آن در زبان‌های برنامه‌نویسی گوناگون شامل ++C، «جاوا» (Java)، «پایتون» (Python)، «سی‌شارپ» (#C) و «پی‌اچ‌پی» (PHP) پرداخته شده است. سطرهای مثلث پاسکال معمولا با آغاز از بالاترین سطر، به عنوان سطر شماره صفر (یعنی n = ۰) شمارش می‌شوند. ورودی‌های هر سطر، از سمت چپ با آغاز از k = 0 شمارش می‌شوند و مقدار آن‌ها وابسته به اعداد موجود در سطرهای مجاور است. یک مثلث خیام پاسکال را می‌توان به صورت زیر ساخت.

997696

در سطر صفر (بالاترین سطر)، یک ورودی یکتای غیر صفر یعنی یک (۱) وجود دارد. هر ورودی در سطرهای زیرین، با محاسبه مجموع عددهای بالایی از چپ به راست محاسبه می‌شود و موارد فاقد ورودی، صفر محسوب می‌شوند. برای مثال، مقدار اولیه در سطر اول (یا هر سطر دیگری) برابر با یک (۱) است (جاصل جمع صفر و یک). این در حالی است که به عنوان نمونه، در سطر سوم (n = 3)، یک و سه با یکدیگر جمع می‌شوند و مقدار ۴ را برای سطر بعدی (سطر چهارم) می‌سازند. در انیمیشن زیر، آنچه بیان شد را می‌توان مشاهده کرد.

برنامه محاسبه مثلث خیام پاسکال

فرمول مثلث خیام پاسکال

ورودی سطر nاُم و ستون kاُم به صورت (nk)\left(\begin{array}{c}n\\ k\end{array}\right) مشخص می‌شود. برای مثال، ورودی یکتای غیر صفر بالاترین سطر (سطر صفر و ستون صفر)، به صورت (00)=1\left(\begin{array}{c}0\\ 0\end{array}\right)=1 است. با توجه به این موضوع، می‌توان روش محاسبه بیان شده در پاراگراف پیشین را به صورت زیر نوشت:

(nk)=(n1k1)+(n1k)\left(\begin{array}{c}n\\ k\end{array}\right)=\left(\begin{array}{c}n - 1\\ k - 1\end{array}\right)+\left(\begin{array}{c}n - 1\\ k\end{array}\right)

برای عدد صحیح غیر صفر 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(line,i)=line!/((linei)!)i!)C(line, i) = line! / ( (line-i)!) * 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
بر اساس رای ۲۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
GeeksforGeeks
۱ دیدگاه برای «برنامه محاسبه مثلث خیام پاسکال — راهنمای کاربردی»

من میخام بدونم که چطوری ی ایف بنویسم برای اینکه بفهمم ی عدد به اعداد مشخصی توی این مثلث تکرار شده یا نه . اگه بخام بهتر بگم : ما میدونیم عدد 1 بیشتر از هشت بار تکرار شده . الان میخایم بدونیم که ایا عدد دیگری وجود دارد مثل یک که بیش از 8 بار توی ایم مثلث اومده باشه؟ کدش رو چطوری بنویسیم . میشه برام توضیح بدید و کدش رو برام بزارید تو جواب(کپی پیست کنید مشکلی نداره بیشتر توضیحش مهمه)
و اینکه شما چقدر باهوش هستین که این کدو نوشتین خیلی کار عجیبیه . ولی خب من کلاس نهم هستم و قطعا توی درس های ما نیست . خیلی ازتون ممنونم .

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *