C++ 对二项式共效递归函数的误解
c++ misunderstanding of binomial coeficient recursive function
code:
#include<stdio.h>
int binomialCoeff(int n, int k)
{
// Base Cases
if (k==0 || k==n)
return 1;
else
return binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);
}
int main()
{
int n = 5, k = 2;
printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
return 0;
}
我想我可以理解基本情况。当我们使用 0 表示 n 和 k=n 时,结果是 0!/0!即 = 1。所以我们返回 1。公式
但是我无法理解代码的这一部分:
return binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);
n 的值为 5,k 的值为 2,我得到的结果为 10。(在公式中替换时).公式但是我们为什么要使用故事呢?
还有一件事。为什么当我从键盘设置"n"和"k"时程序不起作用?喜欢这个:
int main()
{
int n,k;
cin>>n;
cin>>k;
printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
return 0;
}
二项式系数的一个特性是:C(n, k) 可以写为 C(n-1,k-1) + C(n-1,k) 对于所有 1 <= k <= n-1。
所以 C(3,2) = C(2,1) + C(2,2) 或 3 = 2 + 1
这是您共享的简单递归示例中使用的内容。
关于你的第二个问题,不知道为什么你应该有任何问题。
但是我们为什么要使用故事呢?
与其说是编程,不如说是数学问题,二项式系数计算有众所周知的递归公式。正是这个公式用在你的程序中。
为什么当我从键盘设置"n"和"k"时程序不起作用
代码看起来是正确的,除了您使用 std::istream 进行输入和 printf 进行输出。究竟什么不起作用?你输入 n>= k 吗?
return binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);
还记得帕斯卡三角吗?它完全使用这种带有加法的递归公式。
但是,我可以看到您不是在构建这个三角形,而只是在使用递归时递归地尝试一次又一次地计算一些二项式系数。记住已经计算出的结果可能会大大提高您的程序性能。你的第二个问题可能是这种情况:
为什么当我从键盘设置"n"和"k"时程序不起作用。 像这样:
它应该可以工作,但是如果您输入相当大的n
并且k
,则可能需要很长时间才能完成程序。运行时复杂度为 O(n2)。使用n > 30
您可能会注意到执行时间很长。
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- C++ 对二项式共效递归函数的误解