CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

这样写代码为什么也不错?

楼主lettermail5(fdsfer)2003-09-02 22:51:27 在 VC/MFC / 基础类 提问

#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

相关问题

  • 为什么自己不能写代码?
  • 第一天写asp,请问这个代码为什么出错??
  • 为什么在.aspx.vb中写的代码,能够执行呢?
  • &为什么不能输出,看这代码怎么写才对?
  • 为什么这样写的代码窗口会发生变化?
  • 哪里有写得不错的MDI程序原代码?
  • 代码为什么错?
  • 在menu中的菜单中写入以下代码,为什么会出错?
  • 为什么在ONHELP事件中写入代码,调不出帮助窗口?
  • 一段关于在form 窗口中写字 的代码,为什么不行??

关键词

  • 函数
  • 内容
  • maketree
  • 递归
  • 调用
  • 变量
  • subtree
  • 理解
  • func
  • 返回

得分解答快速导航

  • 帖主:lettermail5
  • bcpl
  • akiko
  • whoishere
  • nonocast

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo