栈与递归
程序中的“函数调用栈”是栈数据结构的一种应用。
函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处。
函数调用栈中存储的数据为活动记录。活动记录是函数调用时一系列相关信息的记录。

函数调用过程:

程序中的栈空间可看做一个顺序栈的应用。
栈保存了一个函数调用所需的维护信息:
1.函数参数,函数返回地址;
2.局部变量;
3.函数调用上下文。
什么是程序的栈溢出?

在不断的压栈过程中造成栈空间耗尽而产生栈溢出。
栈溢出常由于函数递归过深或局部数组过大造成。

总结:

1.程序栈空间在本质上是一种顺序栈;
2.程序栈空间的访问是通过函数调用进行的;
3.程序栈空间仍然遵从后进先出的规则。

递归的数学思想
递归是一种数学上分而自治的思想。
递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理。
递归需要有边界条件:

1.    当边界条件不满足时,递归继续进行;

2.    当边界条件满足时,递归停止。

用递归解决问题首先要建立递归的模型,下面就作重介绍介个递归的应用实例。

1. 斐波拉契数列递归解法

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

这个数列从第3项开始,每一项都等于前两项之和。所以可以归纳成如下的递归模型。

F(N)  = 0   (N = 0);

F(N)  = 1   (N = 1);

F(N)  = F(N-1) + F(N-2)   (N > 1);

通过上面的模型可以编写如下函数:

int fibonacci(int n)
{if( n > 1 ){return fibonacci(n-1) + fibonacci(n-2);}else if( n == 1 ){return 1;}else if( n == 0 ){return 0;}
}

2. strlen 递归解法

strlen常规的写法是循环依次比对字符串的每一个字符,直至遇到’\0’停止,返回计数值。

递归的写法是只要知道字符串第二个字符以后的长度就可以知道整个字符的长度,建立起的递归模型如下:strlen(str+1)+1。通过上面的模型可以编写如下函数:

int strlen(const char* s)
{if( s == NULL ){return -1;}else if( *s == '\0' ){return 0;}else{return strlen(s+1) + 1;}
}

相关代码下载地址:http://download.csdn.net/download/u014754841/10246751

数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)相关推荐

  1. 递归与递推 输出斐波拉契数列的前n项 python

    输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...

  2. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  3. 斐波那契数列的递推与递归求法

    斐波那契数列的递推与递归求法: OVERVIEW 斐波那契数列的递推与递归求法: (1)递推求Fibonacci: (2)递归求Fibonacci: (3)递归求Fibonacci(记忆化数组优化): ...

  4. [python]练习之递归和循环实现斐波拉契数列

    1 # 程序功能:用递归和循环实现斐波拉契数列 2 # 0 1 1 2 3 5 8 13 21 34 3 4 def digui_fibo(number): 5 if number == 1: 6 r ...

  5. 斐波那契数列的实现(简单递归和动态规划)

    斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using nam ...

  6. 递归、尾递归、迭代算法【在 斐波拉契数列】上的实现

    /*     递归: [逆序]从未知点推到已知点,[顺序]代入已知点结果,从已知点带入并计算到未知点,最终到终点     尾递归: 从起点开始,依顺序计算结果,并无限靠近最终目标点     迭代: 从 ...

  7. php猴子吃桃子问题n天,『PHP学习笔记』系列四:利用函数递归调用思想解决【斐波那契数列】问题和【猴子吃桃问题】问题...

    什么是函数递归思想? 递归思想:把一个相对复杂的问题,转化为一个与原问题相似的,且规模较小的问题来求解. 递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量. 但在 ...

  8. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  9. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

最新文章

  1. java小程序查看器_JAVA的一个查看图片的小程序
  2. 每天定时备份mysql数据库任务
  3. java课堂疑问解答与思考2
  4. DCMTK:修改DICOM文件的类
  5. 库存转换是什么意思_为什么要用WMS系统?WMS能带来哪些价值
  6. 使用 dotnet-monitor 分析.NET 应用程序
  7. Java面试之设计模式七大原则
  8. php fitnesse,Fitnesse+RestFixture:Web 服务回归测试利器
  9. C++中list的各种使用
  10. 改善用户体验,新浪博客的提示窗口,推荐
  11. 故障解决-CPU超频问题解决
  12. LayaBox1.7.16 TiledMap 销毁的问题,TiledMap销毁后屏幕变灰,不能显示
  13. u盘启动盘恢复计算机,怎么还原u盘启动盘为普通u盘?
  14. 零基础入门禅绕画——钢琴物语
  15. Windows窗口(DirectX3D11学习笔记)
  16. 做嵌入式编程,为什么用的是C语言而不是C++呢?
  17. 程序员通病:小厂薪资低,想跳槽,又担心面试过不了!
  18. C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
  19. mod_security简要安装设置指南
  20. 很多人投身到元宇宙的怀抱,仅仅只是看到了元宇宙的热度

热门文章

  1. mysql的数据库操作类_MYSQL数据库操作类
  2. Java 蓝桥杯 阶乘计算
  3. maven导入jar失败
  4. 合肥师范学院计算机与技术,合肥师范学院计算机科学与技术系JAVA复习提纲
  5. 特征筛选3——卡方检验筛选特征(单变量筛选)
  6. rocketmq安装部署过程(4.0.0版本)
  7. PAT甲题题解-1106. Lowest Price in Supply Chain (25)-(dfs计算树的最小层数)
  8. 老外看中国:本土移动应用差异在哪?
  9. HDU4891 The Great Pan 暴力
  10. ADO.NET常用对象详解之:Command对象