0

我正在我的教科书中研究下面的代码。它使用组合方法和阶乘方法来计算给定 n 和 k 的可能结果。我的问题是阶乘方法,特别是 for 循环中的内容。

我了解该程序的所有其他内容,但我不了解阶乘方法中 for 循环中的代码 i <=n。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;

    }

}
4

4 回答 4

4

n是方法的参数:因为方法被声明为int factorial(int n),所以您调用它(例如)factorial(5)将局部变量n设置为5. (在形式上,nis参数5is the argument,尽管通常人们不会费心区分这两个术语。)

于 2012-12-30T23:06:56.080 回答
2

所以,有点数学。通常,当处理数学表达式时,经常使用数学约定。 n通常是指该方法应参考的某个上限上限。

本质上,阶乘的函数定义是这样的。

factorial(n) = {  1 if n = 0, n*factorial(n-1) otherwise.

循环包括n的最终值,因此您可以获得函数的完整表达式(如果您没有,您的答案每次都会偏离n倍。

于 2012-12-30T23:15:53.090 回答
1

您需要 i <= n 因为当您计算 3 的阶乘时!例如,您将拥有 3 个!= 3 * 2 * 1 <=> 1 * 2 * 3

所以,你有你的 n,即 3,而 i 是 1,然后是 2,然后是 3 (n)。

于 2012-12-30T23:14:20.660 回答
0

如果你仔细观察,你会发现在循环 for i 中取一个从 1 到 n 的值,所以在 i=n 点 for 循环终止。以这种形式创建循环以确保阶乘(0)=1。但是,您可以以递归方式重新设计此函数。

于 2012-12-30T23:13:03.140 回答