当前位置:网站首页>学习笔记:栈的应用1_递归(重点)
学习笔记:栈的应用1_递归(重点)
2022-08-08 20:21:00 【程序猿小张的日常笔记】
栈的应用1_递归(重点)
1. 函数调用栈
函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处;
函数调用栈中存储的数据为活动记录,活动记录是函数调用时一系列相关信息的记录。
程序的栈空间可以看做一个顺序栈的应用,栈保存了一个函数调用时所需要的维护信息,包括函数参数,函数返回地址,局部变量, 函数调用上下文。
在不断的压栈过程中造成栈空间耗尽而产生栈溢出,栈溢出常由于函数递归过深或局部数组过大而造成。
2. 递归的定义
在高级语言中,调用自己和其它函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。
3. 递归的实例
(1)递归求n的阶乘
#include<stdio.h>
long fact(int n)
{
long t;
if(n==0||n==1) t=1;
else t=n*fact(n-1);
return t;
}
int main()
{
int n=4;
long f;
f= fact(n);
printf("%d!=%ld\n",n,f );
return 0;
}
分析:

(2)斐波那契数列
斐波那契数列:1,1,2,3,5,8,13… (前相邻两项之和,构成了后一项)

问题:打印出前40位的斐波那契数列
解法1:迭代法
int main()
{
int i;
int a[40];
a[0] = 0;
a[1] = 1;
printf("%d ",a[0]);
printf("%d ",a[1]);
for(i=2;i<40;i++){
a[i] = a[i-1]+a[i-2];
printf("%d ",a[i]);
}
return 0;
}
解法2:递归法
int Fbi(int i)
{
if(i<2)
return i == 0 ? 0 :1;
return Fbi(i-1)+Fbi(i-2);
}
int main(){
int i;
printf("递归显示斐波那契数列:\n");
for(i=0;i<40;i++){
printf("%d ",Fbi(i))
}
return 0;
}
分析:模拟i=5的执行过程

对比两种实现斐波那契的代码。递归和迭代的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结构更清晰,更间洁,更容易让人理解,从而减少读代码的时间。但是大量的递归调用会建立函数副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。因此我们应该视不同情况选择不同的代码实现方式。
(3)n阶Hanoi塔问题
问题描述:假设有三个分别命名为A,B,C的塔座,在塔座x上插有n个直径大小各不相同,且从小到大编号分别为1,2,…,n的圆盘,现要求将塔座A上的n个圆盘借助塔柱B移动到塔柱C,且仍按相同顺序叠排,圆盘移动时需遵循以下规则:
1) 每次只能移动一个圆盘
2)圆盘可以插在A,B,C中的任何一个塔座上
3)任何时刻不能将较大的圆盘压在较小的圆盘上

#include<stdio.h>
void move(char A, char B){
printf("%c -> %c\n",A,B);
}
void hanoi(int n,char A,char B,char C){
if(n==1){
move(A,C);
}
else{
hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-1,B,A,C);
}
}
int main(){
hanoi(2,'A','B','C');
return 0;
}

但行好事,莫问前程。
不忘初心,方得始终。
做好自己,温暖且积极!!
边栏推荐
猜你喜欢

Gartner:2022年全球半导体收入增长预计将放缓至7%,远低于2021年26.3%

电脑win键没有反应(最全方案)

Mei cole studio OpenHarmony equipment development training notes - the first learn notes

西湖大学鞠峰组招聘【塑料降解 / 污水工程 / 微生物学】方向博士后和科研助理...

Ansible自动化运维工具(二)playbook剧本

超人飞来!Flutter 实现满屏的力量感动画!

SushiSwap「SUSHI」下降了 93%,但还没有完全消失

曲面着色器初试--地面轨迹模拟(部分细节不完善)

IJCAI 2022 | 图神经网络可以检测到异常吗?

What are the role of document management system for companies?
随机推荐
买股票安全吗 资金能取出来吗
uni-app微信小程序如何渲染markdown
fillder4不间断提示the system proxy was change,看我解决
How can recommender systems be trusted?A review of the latest "Trusted Recommender System" from Rutgers University, a 43-page pdf explaining the composition and technology of trusted RS
IJCAI 2022 | Can Graph Neural Networks Detect Anomalies?
From interview to autism, five rounds of interviews for byte software testing post, four hours of soul torture...
正则表达式的限定符、或运算符、字符类、元字符、贪婪/懒惰匹配
有幸与美团大佬共同探讨单节点连接数超1.5W的问题
Ansible自动化运维工具(二)playbook剧本
NAACL2022 NER SOTA - RICON study notes
利用shell脚本同时编译生成多个cmake工程
解决执行Command报错fork/exec /xxx/yy: no such file or directory
JMeter测试接口并发场景
fillder4 keeps prompting the system proxy was changed, watch me solve it
Mei cole studio OpenHarmony equipment development training notes - the first learn notes
书法家唐效奇
2022年云商店联合营销市场发展基金(MDF)介绍
WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题
场外基金开户在手机办理安全吗?
劳务派遣业务流程图