C中的因子函数

时间:2014-04-10 01:09:33

标签: c function factorial

我最近开始阅读Jon Erickson的 Hacking:Exploitation Art of the Exploitation 。在本书中,他有以下功能,我将其称为(A):

int factorial (int x)       // .......... 1
{                           // .......... 2
    int i;                  // .......... 3
    for (i = 1; i < x; i++) // .......... 4
        x *= i;             // .......... 5
    return x;               // .......... 6
}                           // .......... 7

这个特殊功能在pg上。直到这个功能,我已经理解了他所描述的一切。公平地说,他已经详细解释了(A)中的所有要素,但回归概念除外。但是,我只是没有看到(A)如何描述

的过程
x! = x * (x-1) * (x-2) * (x-3)

等我将其称为(B)。如果有人可以花时间详细解决这个问题,我会非常感激。既然我正在寻求你的帮助,我会仔细阅读我认为我理解的元素,以便潜在地揭露我相信我理解的元素,但实际上并没有帮助你帮助我从(A)假设到代表(B)。

好的,所以这就是我相信我明白的。

  • 在第1行中,在(int x)中,x被分配了整数类型。我不太确定的是,在factorial (int x)中,是否为int x分配了类型factorial,或者甚至是factorial是一种类型。

  • 第3行很简单; i被赋予类型整数。

  • 第4行我对此不太自信,但我认为我对它有很好的把握。我假设第4行是一个带计数器的while控制结构。在第一个细分中,计数器被称为i,它的初始值被确定为1.我相信第4行的第二个部分i < x指示计数器i是小于x,保持循环。第三个段i++表示,对于此“while a,then b”情况的每个有效循环/迭代,您向i添加1。

  • 在第5行中,我认为x *= i被认为是i * x的简写,但如果我不知道这个函数是为了解释计算阶乘的过程,我将无法有机地解释第4和第5行如何相互作用。

'我谦卑地请求你的帮助。对于帮助我克服这个驼峰的任何人,我提前感谢你。 “

4 个答案:

答案 0 :(得分:2)

忘记为什么这会计算一会儿的阶乘。首先让我们弄清楚它的作用:

int factorial (int x)       // .......... 1
{                           // .......... 2
    int i;                  // .......... 3
    for (i = 1; i < x; i++) // .......... 4
        x *= i;             // .......... 5
    return x;               // .......... 6
}                           // .......... 7

第1行:

暂时忽略括号中的部分,该行显示int factorial (...) - 这意味着这是一个名为factorial的函数,它的类型为int。括号内的位表示int x - 这意味着该函数接受一个名为x的参数,其类型为int。函数可以使用逗号分隔多个参数,但此函数只需要一个。

第3行:

我们正在创建一个变量,我们将其称为int类型的变量。该变量将仅存在于这些花括号中,因此当该函数完成后,我将不再存在。

第4行:

这确实是一个循环控件,它使用我在第3行创建的变量来保持计数。在循环开始时,i=1确保计数从1开始。i<x表示只要i小于x,它就会保持循环。 i++表示每次循环完成花括号中的内容时,变量i将递增。

第5行:

x*=1表示x的值将通过乘以i来更新。每次循环迭代时都会发生这种情况。因此,例如,如果x等于5,则循环将使i等于值1,2,3和4(从1开始但小于x的数字),并且x的值将通过乘以它来更新因此,在循环结束后,x的最终值将为5 * 1 * 2 * 3 * 4,这是因子5的定义。

第6行:

我们需要将x的值返回到外部世界,这就是返回命令的作用 - 它为阶乘函数提供x的值(在我们刚刚使用的示例中,它是因子5的值) )。

然后你的程序中的其他地方你可能会这样做:

int f;
f = factorial(5);

这将使名为x的参数的初始值为5,并使f具有函数的最终值(无论返回什么 - 在这种情况下为5 * 1 * 2 * 3 * 4)

答案 1 :(得分:2)

我认为书中给出的程序是错误的。从理论上讲,for循环永远不会终止,因为x在每次迭代中都在增长,并且比i快得多。 实际上,x会在一段时间后溢出,从而终止循环。

答案 2 :(得分:1)

  1. 程序循环遍历整数1到N-1。 (假设输入值为&#39; N&#39;)
  2. 在循环开始之前,x = N。
  3. 一次迭代后,x = N * 1。
  4. 经过2次迭代后,x = N * 1 * 2.
  5. 在N-1次迭代之后,x = N * 1 * 2 * ....(N-1)。
  6. 哪个是N阶乘。
  7. 所以N!归还。

答案 3 :(得分:1)

第五行是:x * = i;

你应该在这里理解:x = x * i;

循环将在i&lt; X。这意味着直到达到x - 1;

知道我从1开始你会得到这个总和:x * 1 * 2 * 3 * ... *(x - 1)

你可以重新排列这个你得到:1 * 2 * 3 * ... *(x - 1)* x