从一个递归程序中学到的

     这个递归程序是国庆的时候看的,当时也就稍微看了一下,没仔细去想过具体怎么实现的,它说可以就可吧。这几天仔细分析了一下,发现有自己不大理解的地方。虽然只有短短的十几行代码,但是几天没有想出一个所以然。

     今天看到一学长正在辅导,于是跑过去问了下,颇有收获!现在才知道自己的问题不是出在“递归”的理解上,而是程序的具体运行步骤。

接下来看程序吧!

********逆波兰表达式*******

输入:* + 11.0 12.0 + 24.0 35.0

输出:1357.000000

注:逆波兰表达式是一种把运算法前置的表达式,例如普通的表达式2+3 的逆波兰表达式法为 + 2  3  。

#include<stdio.h>
#include<math.h>
double exp(){
	char a[10];
	scanf("%s",a);
	switch (a[0]){
		case '+':return  exp()+exp();
		case '-': return exp()-exp();
		case '*':return exp()*exp();
		case '/': return exp()/exp();
		default : return atof(a);	
	}
}
int main() {
	double b;
	b=exp();
printf("%f",b);
	return 0;
}

开始我的理解是当程序接受输入时 例如输入  * + 11.0 12.0 + 24.0 35.0 ,那么数组a 将依次存入这些字符,当我发现数组a根本不够存。很不解,然后我没管它继续看看吧。接下来判断a[0]中的字符是什么,然后在调用exp()进行递归。这时候我发现问题就来了,它每次递归只管a[0],而a[0]不是恒为‘*’吗? 难道就这样无休止的调用?我就卡在这里了,想不通。

现在呢,终于明白了,程序不是这样执行的。当a接受第一个字符后“switch ”就马上会进行比较是不是运算符,是运算符的话就在调用,a数组就重新接受输入,再重新进行判断,当发现不是运算符的时候就继续接受输入,将a转换为浮点型返回。这样前面的所有疑惑就都解决了。原来并不是a 接受完所有的输入才进入“switch”的.....

2013年11月19日


你可能感兴趣的:(从一个递归程序中学到的)