【问题标题】:Converting to a Recursive Function?转换为递归函数?
【发布时间】: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函数中使用。

标签: c++ math recursion


【解决方案1】:

我认为你的导师希望你使用这个recurrent definition

C(N, 1) = N
C(N, K) = C(N, K-1) * (N + 1 - K) / K

此定义可让您避免在 choose 函数中使用阶乘、递归。

【讨论】:

  • 我想知道是否希望学生能够推导出循环定义。使用辅助(入口)函数,可以从 C(N, K) = C(N, min(N-K, K)) 开始减少递归次数,其中 min() 是最小值函数。例如 C(10,8) == C(10,2)
  • 循环定义应该以 C(N, 0) = 1 开头。见boundary values
【解决方案2】:

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

现在你的导师的意思是他想要选择函数递归,例如:

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

【讨论】:

  • @Cheersandhth.-Alf 已修复
  • 哦。那么,C(n,r)=n*C(n-1,r) 简化为纯阶乘,所以这也有点错误?
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多