Recursion 调用f(4,2)返回什么值?

Recursion 调用f(4,2)返回什么值?,recursion,Recursion,到目前为止,我得到的是这个。但是我如何找到这个函数调用的值呢 //pseudocode //n and k are nonnegative integers` int f(int n, int k)` `if(k*n ==0)` `return 1` `else` `return f(n-1,k-1)+f(n-1,k)` `end if` end f 基本上,答案只是继续你开始的工作: f(3,1)

到目前为止,我得到的是这个。但是我如何找到这个函数调用的值呢

    //pseudocode
//n and k are nonnegative integers`
int f(int n, int k)`
    `if(k*n ==0)`
        `return 1`
    `else`
        `return f(n-1,k-1)+f(n-1,k)`
`end if`
end f

基本上,答案只是继续你开始的工作:

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,1)+f(1,2)
         f(0,0)+f(0,1)            f(0,1)+f(0,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,1)+f(1,2)
         f(0,0)+f(0,1)            f(0,1)+f(0,2)
答案是11

理解递归函数调用的一个简单方法是展开递归调用堆栈树,它可以帮助您清楚地
了解整个过程(希望pic足够清晰):

在我提到的注释中,我提到了递归过程中的分割和征服过程,因此我更新了一个新图像以包含整个过程。希望这能有所帮助:-)

答案是11

理解递归函数调用的一个简单方法是展开递归调用堆栈树,它可以帮助您清楚地
了解整个过程(希望pic足够清晰):



在我提到的注释中,我提到了递归过程中的分割和征服过程,因此我更新了一个新图像以包含整个过程。希望这能有所帮助:-)

谢谢,但你能帮我把它分解一下吗?我知道怎么做这棵树,但你是怎么想出答案的?你补充了什么?例如,我在您的图像中看到(在左上方)一个4和(在右上方)一个7。你能在这里解释一下这个过程吗?@julian,好吧,任何递归算法都遵循
分治
模式,它将
分割
输入,直到它达到
终端条件
,然后,一个结果将返回到它的函数调用的上层,并被
征服
,然后再次返回到它的上层,直到它到达顶层生成最终结果。你已经得到了
divide
部分,让我们看看左边部分的
converge
部分:最低的
f(0,0)+f(0,1)
1+1=2
,这是
f(1,1)
的结果,再上一级,
f(2,1)
将是
f(1,0)+2=3
,再次是
f(3,1)=Julian,我更新了一张新图片,解释了函数调用如何遍历整个递归调用以获得最终答案的过程,黑色箭头表示调用,粉色箭头表示返回。希望能有所帮助:-)再清楚不过了,谢谢分享。很好的解释。很乐意帮忙:-)谢谢,但你能帮我解释一下吗?我知道怎么做这棵树,但你是怎么想出答案的?你补充了什么?例如,我在您的图像中看到(在左上方)一个4和(在右上方)一个7。你能在这里解释一下这个过程吗?@julian,好吧,任何递归算法都遵循
分治
模式,它将
分割
输入,直到它达到
终端条件
,然后,一个结果将返回到它的函数调用的上层,并被
征服
,然后再次返回到它的上层,直到它到达顶层生成最终结果。你已经得到了
divide
部分,让我们看看左边部分的
converge
部分:最低的
f(0,0)+f(0,1)
1+1=2
,这是
f(1,1)
的结果,再上一级,
f(2,1)
将是
f(1,0)+2=3
,再次是
f(3,1)=Julian,我更新了一张新图片,解释了函数调用如何遍历整个递归调用以获得最终答案的过程,黑色箭头表示调用,粉色箭头表示返回。希望能有所帮助:-)再清楚不过了,谢谢分享。很好的解释。很乐意帮忙:-)1+1+1+1+1+1+1+1+1+1+1+1你是怎么想出11次1的?你能解释一下这个过程吗?@julian好吧,你用
f(3,1)+f(3,2)
替换
f(4,2)
,然后一次又一次地释放每个部分。每次有一个参数为零时,它将返回
1
,因此您将替换为
1
,并且不能进一步替换。最后你有一长串的
1
,中间有加号。这是相当标准的替代品。在我的计算中,我对每一行的每一部分做了一次扩展,除了
1
,当然不能进一步扩展。谢谢Sylvester,但是当你用f(3,1)+f(3,2)替换f(4,2)时,你到底算什么?是否每次递归遍历函数时都添加1?我仍然不清楚如何得到11。@julian否。我每次展开a
f(n,k)
时加1,
n
k
都是零。基本情况
n*z==0
使其返回
1
,对于所有其他情况,它变成了对
f
的两个简单调用的总和,这两个调用都需要再次展开。你一直在扩张,直到没有更多的东西可以扩张。我在这个答案中一步一步地做,而
=
就是要看这一行和下一行是一样的。1+1+1+1+1+1+1+1+1+1+1你是怎么想出11次1的?你能解释一下这个过程吗?@julian好吧,你用
f(3,1)+f(3,2)
替换
f(4,2)
,然后一次又一次地释放每个部分。每次有一个参数为零时,它将返回
1
,因此您将替换为
1
,并且不能进一步替换。最后你有一长串的
1
,中间有加号。这是相当标准的替代品。在我的计算中,我对每一行的每一部分做了一次扩展,除了
1
,当然不能进一步扩展。谢谢Sylvester,但是当你用f(3,1)+f(3,2)替换f(4,2)时,你到底算什么?是否每次递归遍历函数时都添加1?我仍然不清楚如何得到11。@julian否。我每次展开a
f(n,k)
时加1,
n
k
都是零。基本大小写
n*z==0
使其返回