数据结构—递归的应用
2017-06-15 22:48
399 查看
相信很多学过C语言的同学都有接触过递归调用,那么还有必要在数据结构中再次把他作为一部分来写出来吗?
我同大家的想法相同,看到递归时也是这么想的,但是接触后,发现自己错了,也有可能自己愚钝,有些代码总是看不懂,但这不至于影响我学习的步伐,来贴出今天的学习成果吧。
首先来说说递归调用与栈的关系。
在程序中,“函数调用栈”是栈数据结构的一种应用
函数调用栈一般是从高地址向低地址增长
栈底为内存的高地址处
栈顶为内存的低地址
函数调用栈中存储的数据为活动记录,活动记录是函数在调用是的一系列相关信息的记录
程序中的栈空间可看做一个顺序栈的应用
栈保存了一个函数调用所需的维护信息
函数参数,函数返回地址
局部变量
函数调用上下文等信息。
下面是个函数递归调用的显示。
说实话,我到现在还不是很是理解这条代码中到最后的输出之间的关系。
若有有识之士看到后能稍作点拨,在此谢谢了。
下面问题什么是程序的栈溢出?
在不断的压栈过程中造成栈空间耗尽而产生的栈溢出
栈溢出常由于函数递归过深或局部数组过大造成
程序栈空间在本质上是一种顺序栈
程序栈空间的访问是通过函数调用进行的
程序栈空间仍然遵从后进先出的规则
在递归调用中我觉得程序的思想更显得尤为重要,下面就来贴代码吧。
首先来我们熟悉的斐波拉茨数列的实现的代码。
这个在这里不多说什么了说,相信接触过C语言的童鞋都能写出来。
下面用递归调用来实现下strlen函数的功能。
在这里也不多做说明了,也很简单。
下面来用递归调用来实现汉诺塔解法。
代码如下:
代码虽短,但是思想显而易见,很受用。大家可以学习下。
下面就是我没太理解透彻的全排列问题了。
在数学中,我们都接触过,n个字符进行排列,会出现出n!种结果。
下面用C语言实现下排列的组合问题。
代码如下:
但是在理解该程序过程中出现了问题,总是不能理解其中for循环里面的内容,若有哪位大哥可以点拨,在此先表示感谢。
今天的内容就到这了,感谢每位查看的,欢迎指导。
我同大家的想法相同,看到递归时也是这么想的,但是接触后,发现自己错了,也有可能自己愚钝,有些代码总是看不懂,但这不至于影响我学习的步伐,来贴出今天的学习成果吧。
首先来说说递归调用与栈的关系。
在程序中,“函数调用栈”是栈数据结构的一种应用
函数调用栈一般是从高地址向低地址增长
栈底为内存的高地址处
栈顶为内存的低地址
函数调用栈中存储的数据为活动记录,活动记录是函数在调用是的一系列相关信息的记录
程序中的栈空间可看做一个顺序栈的应用
栈保存了一个函数调用所需的维护信息
函数参数,函数返回地址
局部变量
函数调用上下文等信息。
下面是个函数递归调用的显示。
#include <stdio.h> void reverse(char* s) { if( (s != NULL) && (*s != '\0') ) { reverse(s + 1); printf("%c", *s); } } int main() { reverse("12345"); printf("\n"); return 0; }
说实话,我到现在还不是很是理解这条代码中到最后的输出之间的关系。
若有有识之士看到后能稍作点拨,在此谢谢了。
下面问题什么是程序的栈溢出?
在不断的压栈过程中造成栈空间耗尽而产生的栈溢出
栈溢出常由于函数递归过深或局部数组过大造成
程序栈空间在本质上是一种顺序栈
程序栈空间的访问是通过函数调用进行的
程序栈空间仍然遵从后进先出的规则
在递归调用中我觉得程序的思想更显得尤为重要,下面就来贴代码吧。
首先来我们熟悉的斐波拉茨数列的实现的代码。
#include <stdio.h> 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; } } int main() { int i = 0; for(i=1; i<=10; i++) { printf("fibonacci(%d) = %d\n", i, fibonacci(i)); } return 0; }
这个在这里不多说什么了说,相信接触过C语言的童鞋都能写出来。
下面用递归调用来实现下strlen函数的功能。
#include <stdio.h> int strlen(const char* s) { if( s == NULL ) { return -1; } else if( *s == '\0' ) { return 0; } else { return strlen(s+1) + 1; } } int main() { printf("strlen(\"12345\") = %d\n", strlen("12345")); printf("strlen(NULL) = %d\n", strlen(NULL)); printf("strlen(\"\") = %d\n", strlen("")); return 0; }
在这里也不多做说明了,也很简单。
下面来用递归调用来实现汉诺塔解法。
代码如下:
#include <stdio.h> void hanoi(int n, char a, char b, char c) { if( n > 0 ) { if( n == 1 ) { printf("%c -> %c\n", a, c); } else { hanoi(n-1, a, c, b); printf("%c -> %c\n", a, c); hanoi(n-1, b, a, c); } } } int main() { hanoi(3, 'a', 'b', 'c'); return 0; }
代码虽短,但是思想显而易见,很受用。大家可以学习下。
下面就是我没太理解透彻的全排列问题了。
在数学中,我们都接触过,n个字符进行排列,会出现出n!种结果。
下面用C语言实现下排列的组合问题。
代码如下:
#include <stdio.h> void permutation(char s[], int b, int e) { if( (0 <= b) && (b <= e) ) { if( b == e ) { printf("%s\n", s); } else { int i = 0; for(i=b; i<=e; i++) { char c = s[b]; s[b] = s[i]; s[i] = c; permutation(s, b+1, e); c = s[b]; s[b] = s[i]; s[i] = c; } } } } int main() { char s[] = "abcd"; permutation(s, 0, 3); return 0; }
但是在理解该程序过程中出现了问题,总是不能理解其中for循环里面的内容,若有哪位大哥可以点拨,在此先表示感谢。
for(i=b; i<=e; i++) { char c = s[b]; s[b] = s[i]; s[i] = c; permutation(s, b+1, e); c = s[b]; s[b] = s[i]; s[i] = c; }
今天的内容就到这了,感谢每位查看的,欢迎指导。
相关文章推荐
- 14、数据结构笔记之十四栈的应用之栈与递归之阿克曼函数
- 15、数据结构笔记之十五栈的应用之栈与递归之八皇后问题
- 16、数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题
- 数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)
- 数据结构之栈与递归的应用(全排列递归解法)
- 数据结构5————栈的应用2-非递归解决迷宫和马踏棋盘问题
- 12、数据结构笔记之十二栈的应用之栈与递归之阶乘实现
- 数据结构之栈的应用----迷宫求解
- 数据结构上机测试1:顺序表的应用
- 数据结构(二)二叉搜索树-非递归实现遍历
- 数据结构之汉诺塔(递归)
- 经典数据结构与算法在经典软件(linux kernel)中的应用
- 数据结构实验之串三:KMP应用
- 数据结构——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- c++STL 数据结构之queue队列应用
- 数据结构上机测试1:顺序表的应用
- 数据结构实践——循环双链表应用
- 数据结构————链表及其简单应用