我正在我的教科书中学习以下代码。它使用组合方法和因子方法来计算给定n和k的可能结果。我的问题是使用factorial方法,特别是for循环中的内容。
我理解程序的其他所有内容,但我不理解在factorial方法的for循环中的代码i< = n。该程序的其他部分是什么?我只是不确定i< = n背后的原理或程序员如何提出这个问题。
import acm.program.*;
public class combinations extends ConsoleProgram {
public void run(){
int n = readInt("Enter the number of objects in the set (n): ");
int k = readInt("Enter the number to be chosen (k): ");
println("C (" + n + ", " + k + ") = " + combinations (n, k) );
}
private int combinations (int n, int k){
return factorial (n) / (factorial (k) * factorial (n-k));
}
private int factorial (int n){
int result = 1;
for (int i = 1; i <= n; i++){
result *= i;
}
return result;
}
}
答案 0 :(得分:4)
n
是方法的参数:因为该方法声明为int factorial(int n)
,所以您将其调用为(例如)factorial(5)
以获取局部变量n
设为5
。 (在形式上,n
是参数,5
是参数,但通常人们都不愿意区分这两个术语。 )
答案 1 :(得分:2)
所以,有点数学。通常,当处理数学表达式时,经常使用数学约定。 n 通常被称为该方法应引用的某些上限值。
基本上,阶乘的函数定义就是这个。
factorial(n) = { 1 if n = 0, n*factorial(n-1) otherwise.
循环包含 n 的最终值,所以你得到了函数的完整表达式(如果你没有,你的答案就会被一个因素所取代)每次 n 。
答案 2 :(得分:1)
你需要我&lt; = n因为你计算3的阶乘!例如,你会有 3! = 3 * 2 * 1&lt; =&gt; 1 * 2 * 3
所以,你有你的n,即3,i是1,然后是2,然后是3(n)。
答案 3 :(得分:0)
如果你仔细观察,你会看到循环中的i取1到n的值,所以在i = n点,循环终止。循环for以此形式创建,以确保factorial(0)= 1。但是,您可以以递归方式重新设计此功能。