您的位置:首页 > 理论基础 > 数据结构算法

数据结构—递归的应用

2017-06-15 22:48 399 查看
相信很多学过C语言的同学都有接触过递归调用,那么还有必要在数据结构中再次把他作为一部分来写出来吗?

我同大家的想法相同,看到递归时也是这么想的,但是接触后,发现自己错了,也有可能自己愚钝,有些代码总是看不懂,但这不至于影响我学习的步伐,来贴出今天的学习成果吧。

首先来说说递归调用与栈的关系。

在程序中,“函数调用栈”是栈数据结构的一种应用

函数调用栈一般是从高地址向低地址增长

栈底为内存的高地址处

栈顶为内存的低地址

函数调用栈中存储的数据为活动记录,活动记录是函数在调用是的一系列相关信息的记录

程序中的栈空间可看做一个顺序栈的应用

栈保存了一个函数调用所需的维护信息

函数参数,函数返回地址

局部变量

函数调用上下文等信息。

下面是个函数递归调用的显示。

#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;
}


今天的内容就到这了,感谢每位查看的,欢迎指导。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: