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留下了一些事情要做。。。