我有一个非常简单的函数来找出整数堆栈的最大非负值。我想将此函数转换为递归函数。 有几点需要牢记:
num
,但尚未为其分配任何值。并且,我们不应该依赖于C在某些条件下自动将0分配给num
的事实s
为空,我们在num
这是迭代函数:
void max_stack(stack *s, int *num){
*num = 0;
int aux = 0;
while (!emptyStack(*s)){
aux = top(*s);
pop(s);
if (aux>*num){
*num = aux;
}
}
}
答案 0 :(得分:2)
为了匹配完全提供的迭代代码,我们还必须匹配这样的假设:即使在空堆栈上,0
是将存储在target参数中的最小值。
有了这个:
void recursive_max_stack(stack *s, int *num)
{
if (emptyStack(*s))
{
*num = 0;
return;
}
int lhs = top(*s);
pop(s);
recursive_max_stack(s, num);
if (lhs > *num)
*num = lhs;
}
<强>解释强>
首先,我们需要一个默认情况(当堆栈中没有元素时)。就像你的迭代函数一样,默认情况下也会存储零。
if (emptyStack(*s))
{
*num = 0;
return;
}
所以我们需要在当前帧中保存当前堆栈顶部,然后将其从堆栈中弹出(记住,我们将其保存在局部变量中):
lhs = top(*s);
pop(s);
一旦完成,我们可以递归。
recursive_max_stack(s, num);
从递归返回时,会将每个lhs
与*num
的内容进行比较(当我们达到最大深度时,设置为0
)。如果更大,lhs
将替换*num
中存储的值。
if (lhs > *num)
*num = lhs;
这将继续向上调用堆栈,因为我们展开调用,最后返回到初始调用,然后返回调用者,*num
现在保持堆栈中最大的非负值,或者如果全部为0值为负(或堆栈为空)。
就是这样。这并不关心*num
中存储的原始值。在达到最大递归深度时最终被0
替换,然后每当后续帧的lhs
值大于*num
中的当前存储值时,再次替换
答案 1 :(得分:0)
这将起作用的方式是,如果堆栈不为空,那么它将继续调用自身向前传递最大值。一旦堆栈为空,函数将逐个返回,通过num指针返回最大值;
这里是伪代码:
void max_stack(stack *s, int * num){
int aux = 0;
if(!emptyStack(*s)){
aux = top(*s);
pop(s);
if (aux > (*num)){
(*num) = aux;
}
max_stack(s, num);
}
}
首次调用此函数时,您可以这样称呼它:
int num = 0
max_stack(s, &num);