标签:
首先我们先来看一个程序;我相信看完这个程序;你们可以大概了解:
/*
 * 2015年5月6日13:57:22
 * 目的:通过栈的数据结构来实现递归
 * 深入了解递归的本质。
 * 下面我分别举2个例子,就是分别用递归和栈的形式
 * 来实现f(n) = 1+2+...+n自然数的相加;方法很简单,
 * 主要是为了让我们了解递归的内部实现机制.
*/
/*
* 操作系统在调用递归函数是分为两步:
* 1.将调用函数的地址和变量存起来(stack)然后为被调用函数开辟内存空间。
* 2.将被调用函数的结果保存起来,从栈顶取出调用函数的变量继续执行。
*/
# include <stdio.h>
# define MAXSIZE 50
/*
 * 这里我们要定义一个结构体专门是用来模拟计算机存储地址和n的值(对于这个程序要存储n的值)
*/
//构建一个顺序栈,这里我们不考虑数组越界的情况
struct Stack{
	int *array;
	int length;
	int top; //设置栈顶指针
};
/*初始化一个栈*/
void initStack(Stack *stack)
{
	stack->array = new int[MAXSIZE];
	stack->length = 0;
	stack->top = -1;
}
void push(Stack *stack,int value)
{
	stack->top++;
	stack->array[stack->top] = value;
}
//出栈
void pop(Stack *stack,int *value)
{
	*value = stack->array[stack->top];
	stack->top--;
}
//返回栈顶元素
int peek(Stack *stack)
{
	return stack->array[stack->top];
}
bool isEmpty(Stack *stack)
{
	if(stack->top == -1)
		return true;
	else
		return false;
}
/*使用递归的方式来实现自然数相加,每一个递归都有一个结束条件
* 这个递归结束的条件是n == 1;
*/
int addNumber(int n)
{
	if(n == 1)
	{
		return 1;
	}
	else
	{
		return (addNumber(n-1)+n);
	}
}
/*用栈的形式实现递归*/
void stackAddNumber(int n,Stack *stack,int *resultValue)
{
	while(n >= 1)
	{
		push(stack,n);
		n--;
	}
	//栈不为空时
	while(!isEmpty(stack))
	{
		int value;
		pop(stack,&value);
		*resultValue = *resultValue + value;
	}
}
int main()
{
	int n = 10;
	int sum = addNumber(n);
	printf("递归实现形式:%d \n",sum);
	int addsum = 0;
	Stack stack;
	initStack(&stack);
	stackAddNumber(n,&stack,&addsum);
	printf("栈实现下的结果:%d\n",addsum);
	return 0;
}接下来就我自己所了解的操作系统对于递归函数的内部实现原理大致地做个介绍,如果那个地方讲的不好,希望大家指正。
递归每一次调用时,系统都会在栈中存储调用函数的地址和相应需要下一步进行操作的变量。可能说的比较抽象,那么我们举个例子,就拿上面的求1......n的和,每一次递归调用,栈都会存储stackaddNumber函数的地址和变量n的地址,为下一步递归递归调用做好准备。
可能我讲的不是很清楚,我给大家推荐一个写的比较好的文章吧,定会让你们有所收获。
http://blog.csdn.net/z1547840014/article/details/12226737#comments
希望大家和我一样每天都进步。坚持!
标签:
原文地址:http://blog.csdn.net/u011257298/article/details/45536943