如何手动解决返回另一个递归函数的递归函数?

时间:2014-12-20 21:04:32

标签: recursion

这是一个返回x y

的样本函数
int fun(int x, int y)
{
    if (y == 0)   return 0;
    return (x + fun(x, y-1));
}

int fun2(int a, int b)
{
    if (b == 0) return 1;
    return fun(a, fun2(a, b-1));
}
  

fun2(2,3)如何返回x y

如何将它们放在堆栈上执行?
如果要求手动解决此问题,算法将如何分解?

2 个答案:

答案 0 :(得分:0)

例如,如果您使用x和x调用函数fun,则fun函数将返回x*y,它将为您提供x 2

考虑到使用函数fun找到x y ,你只需要像fun(x,x y-1 )一样调用fun,所以如果你的这个{{ 1}}生成 0 = 1此fun2(a,0)将返回 1 fun(a, fun2(a, 0))返回值为fun(a, fun2(a, 0)),所以很有趣(a,1)= a 1 这种方法你有fun2(a,b-1)= a b-1 ,正如我上面所说,你玩得很开心(a ,fun2(a,b-1))= a b

答案 1 :(得分:0)

让我们开始解决fun(int x,int y)函数,因为它不会调用任何其他函数,而是自己

让我们分析示例$result = fun(x, y);

上的x变量
$result = 
x + ( // fun(x, y - 1)      
    x + ( // fun(x, y - 2)  
        .......
                x + ( // fun(x, 1)
                    x + 0 // fun(x, 0) is 0
                )
        .......
    )
);

请注意,这是x + (x + ( ... x + 0)) = y * x,但有时这很难分析,所以请阅读进一步的解释。

现在让我们看看如果我们在示例$result = fun((x + k), y);

上将x参数更改为x + k,会发生什么变化
$result = 
((x + k) + 1) + ( // fun((x + k), y - 1)        
    (x + k) + ( // fun((x + k), y - 2)  
        .......
                (x + k) + ( // fun((x + k), 1)
                    (x + k) + 0 // fun((x + k), 0) is 0
                )
        .......
    )
);

所以一个重要的决定是参数x的变化, 不影响递归步骤, 所以它不会影响函数的解决版本。

现在让我们改变y参数并分析示例$result = fun(x, y + k);

$result = 
x + ( // fun(x, y + k - 1)      
    x + ( // fun(x, y + k - 2)  
        .......
                x + ( // fun(x, (y + k) - k) this is the same as fun(x, y)
                    x + ( // fun(x, y - 1)      
                        x + ( // fun(x, y - 2)  
                            .......
                                    x + ( // fun(x, 1)
                                        x + 0 // fun(x, 0) is 0
                                    )
                            .......
                        )
                    );
        .......
    )
);

正如我们所看到的,参数y的变化也会改变递归步骤

k = 1, fun(x, (y + 1))可以解决为x + fun(x, y)

k = 2, fun(x, (y + 2))可以解决为x + fun(x, y + 1)等于x + (x + fun(x, y))等于2 * x + fun(x, y)

因此fun(x, y)等于表达式(y * x)

告诉我你是否希望我继续。