C++ 递归帮助
我正在为即将到来的测试找出以下问题。我到处都搜索过,我了解递归的基本原理。对于这个问题,我不理解的是C++ 递归帮助,c++,recursion,C++,Recursion,我正在为即将到来的测试找出以下问题。我到处都搜索过,我了解递归的基本原理。对于这个问题,我不理解的是int n和int k的值。我有这个问题的答案,因为这是一个实践问题,但我不知道答案是如何找到的 // Precondition: n and k are non-negative integers int f(int n, int k) { if (k * n == 0) return 1 else return f(n - 1, k - 1)
int n
和int k
的值。我有这个问题的答案,因为这是一个实践问题,但我不知道答案是如何找到的
// Precondition: n and k are non-negative integers
int f(int n, int k) {
if (k * n == 0)
return 1
else
return f(n - 1, k - 1) + f(n - 1, k)
}
调用返回什么值
f(4,2)
?只要看看它是如何调用的
f(4,2)进入第二个街区,调用f(3,1)+f(3,2)
f(3,1)调用f(2,0)+f(2,1)=1+f(1,0)+f(1,1)=1+1+f(0,0)+f(0,1)=1+1+1=4
f(3,2)调用f(2,1)+f(2,2)=f(1,0)+f(1,1)+f(1,1)+f(1,2),依此类推
您应该可以从这里解决问题。我不确定问题出在哪里
f(4,2)=f(3,1) + f(3,2)
=(f(2,0)+f(2,1) )+ (f(2,1) +f(2,2))
=(1 +(f(1,0)+f(1,1))+((f(1,0)+f(1,1))+(f(1,1)+f(1,2))
=(1 + 1 +(1+1)) +( 1 +(1+1) + (1+1) +1 + 1 ))
=11
只要在纸上模拟一下(4,2的情况下没有太多的递归),对于这样的问题,它有助于找出纸上发生了什么。创建一个包含n和k列的表,并在每次调用函数时生成一行。跟踪哪个行是哪个其他行的父行(即哪个
f
调用哪个其他f
——如果您将每个调用相对于生成它的函数行缩进,很容易看到这一点)。您将最终构建完整的调用树,您将看到这些值是如何传播的。f(4,2)
返回的值是f(3,1)+f(3,2)
。来自数学背景,我要说,能够在纸上解决这些问题是一项非常有用的技能。尝试创建一个描述每次调用后状态的表达式序列-提示:1:f(4,2)->f(3,1)+f(3,2)2:f(3,1)+f(3,2)->(f(2,0)+f(2,1))+…“我不明白,对于这个特殊问题,分别是(int n和int k)的值。”->n=4和k=2。这是一个问题,很好,你在免费给别人做家庭作业,我会记住你的。所以帮了我很多次。我只是给back@MonoThreaded给一个人一条鱼,你可以喂他一天;教他如何钓鱼,你可以喂他一辈子。所以,钓鱼不是为了钓鱼,而是为了鱼。对不起;)它产生了一个不同的答案。+1一个,因为你给OP留下了一些事情要做。。。