【发布时间】:2019-11-24 11:45:22
【问题描述】:
我想更深入地理解递归,而不仅仅是直观。我知道这个概念,也知道如何递归求解阶乘或斐波那契数列。但是当递归使用时,我似乎无法很好地想象链表中到底发生了什么。
更具体地说,我正在努力理解以下算法:
(它在链表中查找最大值。它通过从第二个元素开始递归搜索最大值。然后将其与第一个元素进行比较并返回较高的那个。)
function MaxRec (inRefBegin : tRefList) : tRefList;
{ returns recursively a pointer to the max element in a list }
var
rekMax : tRefList; { variable to point to the recursive maximum
starting from second element }
begin
if inRefBegin = nil then { Base Case, recursion stops }
MaxRec := nil
else
begin
rekMax := MaxRec (inRefBegin^.next);
if rekMax = nil then
MaxRec := inRefBegin
else
if inRefBegin^.info < rekMax^.info then
MaxRec := rekMax
else
MaxRec := inRefBegin
end { if }
end; { MaxRec }
我确实明白理论上应该发生什么。我很难一步一步地想象它。每个堆栈级别会发生什么?
我不明白这一行如何:rekMax := MaxRec (inRefBegin^.next) 可以找到最大值....它只使用指向下一项的指针调用函数,但不比较任何值....函数被调用的时间??
我的思考过程是这样的: 假设我有一个这样的链表:
5 => 7 => 10 => 3 => 2 => nil
- 函数被调用并且不为零((保存到堆栈))
- 函数被调用并且不为零((保存到堆栈))
- 函数被调用并且不为零((保存到堆栈))
- 函数被调用并且不为零((保存到堆栈))
- 函数被调用并且不为零((保存到堆栈))
递归停止
现在会发生什么?我是否将每个函数与第一个元素进行比较?或者这是我已经拥有递归最大值的地方?可以想象一下吗?
我非常感谢每一个帮助。我知道这个主题在网上有大量资源,相信我已经阅读过它们。但我仍然不清楚每个级别到底发生了什么。
【问题讨论】:
-
嗯,据我所知,您展示的这个函数根本不是递归的。将
ZeigListMax的代码添加到问题中,可能是。 -
对不起伙计,我的错,我更新了代码。现在应该是
标签: list recursion linked-list pascal