我最近开始阅读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行如何相互作用。
'我谦卑地请求你的帮助。对于帮助我克服这个驼峰的任何人,我提前感谢你。 “
答案 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)
所以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