簡體   English   中英

C++:帕斯卡三角

[英]C++: Pascal's Triangle

我正在努力解釋和/或在comb(i, j)long comb(int n, int k)之間建立聯系。 請您向我解釋一下long comb(int n, int k)的 for 循環是如何工作的? 非常感謝。

#include<iostream>
#include<iomanip>
using namespace std;

long comb(int, int);

int main()
{
 int m;
 cout << "Type a number and then press ENTER: ";
 cin >> m;

 for(int i = 0; i < m; i++)
 {
  for(int j = 1; j < (m - i); j++)
  {
   cout << setw(2) << "";
  }
  for(int j = 0; j <= i; j++)
  {
   cout << setw(4) << comb(i, j);
  }
 cout << endl;
 }
}

long comb(int n, int k)
{
 if (n < 0 || k < 0 || n < k)
 {
  return 0;
 }
 long c= 1;
 for(int i = 1; i <= k; i++, n--)
 {
  c = c*(n/i);
 }
 return c;
}

編輯:感謝 Yunnosch 的更正。

long comb(int n, int k)中的for循環使用乘法公式計算二項式系數。

您還可以編寫如下的 for 循環(看起來更像是乘法公式):

for(int i = 1; i <= k; i++) {
    c = c * ((n - i + 1) / i); 
}

long comb(int, int);

int main()之前是long comb(int n, int k) function 的聲明 您必須這樣做,以便代碼編譯。 另一種方法是在main()之前而不是之后定義long comb(int n, int k) function 。 您應該了解 C++ 中聲明和定義的區別。

順便說一句,您的代碼似乎有一個錯誤,並且沒有打印正確的帕斯卡三角形。

這些是代碼中不同出現的comb()的含義。

long comb(int, int);

這意味着“親愛的編譯器。稍后我將為具有這些參數類型的此名稱的 function 提供代碼。請接受我在您看到代碼之前調用它。”
它被稱為“原型”。

cout << setw(4) << comb(i, j);

意思是“親愛的編譯器,記得我告訴過你的 function,但沒有向你展示代碼嗎?請在此處調用它,作為制作 output 的一部分;代碼在下面某處。”

long comb(int n, int k)
{
/* ... */
}

意思是“親愛的編譯器,上面的原型我答應提供一個function這個名字和參數的代碼。我什至讓你從其他代碼中調用它。這里我終於提供了它的代碼。請使用此代碼執行來自 main() 的調用。” (最后一部分中的一些實際上比編譯器更多地解決了 linker,但我認為這里的詳細程度超出了 scope。)

我的印象是您不了解如何學習如何編程:
一個有經驗的程序員會看一段代碼並理解它的含義,但對於初學者來說,這在大多數情況下是行不通的:你需要嘗試這段代碼,調試它,嘗試理解它,大多數時候,嘗試它出來

讓我們看看comb(n,k) :顯然 n 必須大於 k,所以讓我們看看值 n=8 和 k=3 會發生什么:

for(int i = 1; i <= k; i++, n--)
 {
  c = c*(n/i);
 }

i 和 c 會發生什么?

   i      k      n      c
   1      3      8      1*8/1
   2      3      7      1*8/1*7/2
   3      3      6      1*8/1*7/2*6/3

因此,最后: c 變為8*7*6/(1*2*3)

我承認:兩個變量在循環期間發生了變化( i++n-- ),這確實令人困惑,但通過嘗試你會掌握它的竅門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM