【算法】栈与递归的实现
一:函数的调用
当在一个函数调用期间调用另一个函数时,在运行被调函数之前要做的三件事情:
1.将所有实际参数,返回地址(函数调用之后的下一条语句的地址)等信息传递给被调函数保存
2.为被调函数的局部变量(也包括形参)分配存储空间
3.将控制转移到被调函数的入口
在被调函数返回到主调函数之前也要做三件事:
1.保存被调函数的返回结果
2.释放被调函数所占的存储空间(局部变量)
3.依照被调函数保存的地址将控制返回到主调函数
当有多个函数相互调用时,按照“后调用后返回”的原则,上述函数之间的信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每调用一个函数时就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,进行出栈操作,当前运行的函数永远早栈顶位置。
A调用A函数和A函数调用B函数在计算机看来是没有任何区别的!
二:递归满足的三个条件
Fact(n)=1;(n=1)
Fact(n)= Fact(n-1)*n;(n>1)
1.递归必须得有一个明确的终止条件
2.该函数说出你的数据规模必须在递减
3.这个转换必须是可解的
三:递归和循环
1.递归:易于理解、速度慢、所需存储空间大
2.循环:不易理解、速度快、浪费空间小
四:汉诺塔算法实现
#include <stdio.h>int Hanluota(int n,char x,char y,char z){static int count=0;/*将n个盘子借助y从x移到z*/if (n==1){printf("%d:%c->%c\n",n,x,z);count++;}else{Hanluota(n-1,x,z,y);printf("%d:%c->%c\n",n,x,z);count++;Hanluota(n-1,y,x,z);}return count;}void main(){int n,count;printf("please input the n of the Hanluota:");scanf("%d",&n);count=Hanluota(n,'A','B','C');printf("总共需要移动%d次\n",count);}