这样写代码为什么也不错?
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#define M 3
typedef struct node
{
char val;
struct node *subTree[M];
}NODE;
char buf[255], *str=buf;
NODE *d=NULL;
NODE *makeTree()
{
int k;
NODE *s;
s=new node ;
s->val=*str++;
for(k=0; k<M; k++)
s->subTree[k]=NULL; //先赋初值为null
if(*str=='(')
{
k=0;
do
{
str++;
s->subTree[k]=makeTree() ;//makeTree函数递归调用。在执行此语句之前时, 指针S已经有值。 当第一次执行此语句之后, 就会改变指针S的值。也就是说调用makeTree()后, 返回return s; , 再把它赋给s->subTree,是讲不通的。 因为此时,s 的值已经发生了变化。但事实上证明,此程序是正确的, 请问怎样解?
if(*str==')')
{str++;break;}
k=k+1;
}while(*str==',') ;
}
return s;
}
void main()
{
printf("enter exp:");
scanf("%s", str);
d=makeTree();
cout<<d->val;
}
问题点数:100、回复次数:7Top
1 楼bcpl(林平之)回复于 2003-09-02 23:26:26 得分 20
递归调用,栈上的变量不会互相影响Top
2 楼akiko(弥弥)回复于 2003-09-02 23:32:14 得分 30
s->subTree[k]=makeTree();
这是递归调用,makeTree()返回的s可不是"s->subTree[k]"中的s,每一次递归都可以理解为调用了另外一个函数.可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个.Top
3 楼lettermail5(fdsfer)回复于 2003-09-03 11:00:27 得分 0
to :弥弥。
可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个
这样理解确实是容易接受的。
to : 林平之
你说的,递归调用,栈上的变量不会互相影响 。也是想说两个s的地址是不同的吧,
你后面那句"栈上的变量不会互相影响 " 好像是高度概括, 又好像难于理解。
首先,我没有定义什么栈这个东西, 这只是递归调用。两个s 按定义的形式来讲应该是同一个变量才对Top
4 楼lettermail5(fdsfer)回复于 2003-09-03 11:00:44 得分 0
to :弥弥。
可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个
这样理解确实是容易接受的。
to : 林平之
你说的,递归调用,栈上的变量不会互相影响 。也是想说两个s的地址是不同的吧,
你后面那句"栈上的变量不会互相影响 " 好像是高度概括, 又好像难于理解。
首先,我没有定义什么栈这个东西, 这只是递归调用。两个s 按定义的形式来讲应该是同一个变量才对Top
5 楼lettermail5(fdsfer)回复于 2003-09-03 22:22:06 得分 0
upTop
6 楼whoishere(我来也)回复于 2003-09-03 22:55:14 得分 40
在递归调用中,其局部变量都是重新分配内存空间的,因此这些局部变量虽然有着相同的变量名,但在不同级的函数调用中,其在内存中的地址是不一样的,取值的改变自然也就不会相互影响了。
bcpl(林平之) 所言的栈,并非你所定义的栈,而是windows程序调用的时候自动建立的,函数调用时参数等都要依次自动进栈,而函数调用结束后又依次自动出栈。Top
7 楼nonocast(如果没有如果)回复于 2003-09-03 23:35:30 得分 10
递归(recurrences)是一种分而治之(divide-and-conquer)思想
建议看一下算法导论
你就会豁然开朗的
静下心三个月好好学一下算法
终身受益
很多,像弥弥讲的你不一定一下子能理解
慢慢来
May you succeed!
Top




