深度搜索

栈与递归;例0-1:输入一个正整数n,求n的阶乘 var n : integer; function fac(n:integer):longint; begin if n = 0 then fac := 1 else fac := n * fac(n-1); end; begin readln(n); writeln(fac(n)); end. ;要理解递归,首先应了解一种数据结构:堆栈(简称栈)的概念。 ;栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素称作进栈、入栈或压栈;从一个栈删除元素又称作出栈或退栈。 ;栈指针top;栈指针top;栈指针top;栈指针top;栈指针top;栈指针top;例0-2:输入n个整数,并逆序输出(栈实现)。 输入样例: 3 1 2 3 输出样例: 3 2 1 ;const maxn = 20; var stack : array[1..maxn] of integer; top : integer; n, i, x : integer; procedure init; begin top := 0; end; function isfull:boolean; begin if top = n + 1 then isfull := true else isfull := false; end;; function isempty:boolean; begin if top = 0 then isempty := true else isempty := false; end; procedure push(x:integer); begin top := top + 1; if isfull = true then writeln(Stack Full) else stack[top] := x; end;; function gettop:integer; begin gettop := stack[top]; end; procedure pop; begin if isempty = true then writeln(Stack Empty) else top := top - 1; end;; begin readln(n); for i := 1 to n do begin read(x); push(x); end; while isempty true do begin write(gettop, ); pop; end; end.;编译器处理函数调用时,就是使用栈来保存数据的。当主调函数调用另一个函数时,编译器将主调函数的所有实参和返回地址压入到栈中,栈指针将移到合适的位置来容纳这些数据。 ;当进行被调函数时,编译器将栈中的实参数据弹出,赋值给函数的形参。在被调用函数执行期间,还可利用栈来保存函数执行时的局部变量。当被调用函数准备返回时,系统将弹出栈中所有当前函数压入栈中的值,这时,栈指针移动到被调用函数刚开始执行时的位置。接着被调用函数返回,系统从栈中弹出返回地址,主调函数就可以继续执行了。 ;回到阶乘的递归算法上来。假设要计算5的阶乘,通过前面设计的递归程序执行过程如下。 首先,在主函数中调用fact(5)函数,将返回地址、参数、局部变量压入堆栈。 ;在fact()函数中,判断n的值若不为0,则递归调用fact(4),这时将函数的返回地址和参数压入堆栈。 ;程序继续递归调用时,将fact(3)、fact(2)、fact(1)逐步压入堆栈 ;当调用fact(0)时,达到阶乘递归算法的结束条件,这时结束fact(0)函数调用,从堆栈中弹出该层的相关数据,并返回函数的结果1。这时栈顶中保存的将是fact(1)中的相关数据 ;当递归函数逐层返回时,栈中压入的数据将逐步弹出,当弹出fact(4)后的栈结果如图所示 ;当函数fact(5)返回时得到5的阶乘等于120,同时从栈中弹出调用函数时的数据,完成整个递归调用,并返回主函数输出执行。 ;搜索;一、引例;一、引例;方法一、穷举法 寻找问题解的一种可靠的方法是首先列出所有可能候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解。理论上,当候选解数

文档评论(0)

1亿VIP精品文档

相关文档