C++ 转换为递归函数?

C++ 转换为递归函数?,c++,math,recursion,C++,Math,Recursion,我仍然有基本递归的问题。我有两个函数,如下所示 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) {

我仍然有基本递归的问题。我有两个函数,如下所示

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));
}
我的指导老师告诉我这实际上是错误的,我应该在choose函数中递归。我不明白为什么,因为choose公式是C(n,r)=n!/(r!·(n–r)!,因为递归的都是阶乘,所以我只做了一个单独的阶乘函数


如果不使用新库,这两个函数如何成为一个递归函数

首先请注意,与C函数中的参数顺序相比,choose函数中的参数顺序是切换的

现在,您的讲师的意思是,他希望选择递归函数,例如:

C(n, r) = n! / (r! · (n – r)!) = n/(n-r) * (n-1)! / (r! · (n -1 – r)!) = n/(n-r)*C(n-1, r)

我想你的导师希望你使用这个:


此定义允许您避免在
choose
函数中使用阶乘递归。

二项式之间几乎有无限多个关系。选择一个似乎合适的递归。使用它,你不需要像现在计算C(n,r)那样计算全阶乘。把公式写在纸上,然后把数值去掉——只剩下几次乘法。例如
C(52,51)
——您当然不需要计算52!还有51!为了得到答案,我认为一个很好的方法是通过计算每一行上的前一个数字来表示帕斯卡三角形,每个数字使用固定数量的算术运算。计算可以使用诸如数字在直线上的位置等信息。我记得在高中时(在一台i8085计算机上)就这样做了,所以,这是非常可行的,而且很有启发性。然后,这将为您提供一个可以轻松表示为递归公式的关系。然后用在
选择
函数中。@cheers-sandhth.-Alf-fixedOh。好的,C(n,r)=n*C(n-1,r)简化为纯阶乘,所以这也有点错误?我想知道学生们是否期望能够推导出循环定义。使用helper(entry)函数,可以通过从C(N,K)=C(N,min(N-K,K))开始减少递归次数,其中min()是最小值函数。例如,C(10,8)=C(10,2),循环定义应以C(N,0)=1开始。看见
C(N, 1) = N
C(N, K) = C(N, K-1) * (N + 1 - K) / K