【发布时间】:2016-12-01 06:06:29
【问题描述】:
我仍然在基本递归方面遇到问题。所以我有两个函数显示为
unsigned long factorial(int x)
{
// recursive function to find factorial
if(x==1)
return 1; // base case
return x * (factorial(x-1)); // recursive call
}
int choose(int choose, int choose_from)
{
// function to find how many different ways to "choose"
// calls factorial function multiple times
return factorial(choose_from) / (factorial(choose) * factorial(choose_from - choose));
}
我的导师告诉我这实际上是错误的,我应该在选择函数中递归。我不明白为什么选择公式是 C(n, r) = n! / (r! · (n – r)!),因为所有被递归的是阶乘,所以我只是做了一个单独的阶乘函数。
这两个函数如何在不使用新库的情况下成为一个递归函数?
【问题讨论】:
-
二项式之间的关系几乎是无限的。选择一个看起来适合递归的。使用它。
-
嗯,您不需要像现在计算 C(n, r) 那样计算全阶乘。在纸上写下公式并取消值 - 你应该只剩下几个乘法。例如
C(52, 51)——你当然不需要计算52!和51!得到答案。 -
我认为一种解决此问题的好方法是通过计算该行上前一个数字的每个数字来呈现帕斯卡三角形,每个数字使用固定数量的算术运算。计算可以使用诸如数字在线上的位置等信息。我记得在高中时(在 i8085 计算机上)这样做,所以,它非常可行,而且很有启发性。然后,这为您提供了一个可以轻松表示为递归公式的关系。然后在你的
choose函数中使用。