[英]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.