堆栈上的递归函数

时间:2017-04-16 17:02:55

标签: c recursion stack iteration

我有一个非常简单的函数来找出整数堆栈的最大非负值。我想将此函数转换为递归函数。 有几点需要牢记:

  • 在运行该函数之前,我们已初始化num,但尚未为其分配任何值。并且,我们不应该依赖于C在某些条件下自动将0分配给num的事实
  • 运行该功能后,堆栈s为空,我们在num
  • 中存储了最大非负值
  • 我是C和数据结构的初学者,所以请保持友善:)

这是迭代函数:

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;
        }
    } 
}

2 个答案:

答案 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);