这是一个返回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 ?
如何将它们放在堆栈上执行?
如果要求手动解决此问题,算法将如何分解?
答案 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);
$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);
$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)
告诉我你是否希望我继续。