日期:2014-05-18  浏览次数:20975 次

高手们帮我分析下着选递归啊!
private void button1_Click(object sender, EventArgs e)
  {
  Test();
  }

  int result = 0;
  string msg="\n 函数的递归调用 : \r\n";

  public void Test()
  {
  msg+="调用语句 : \r\n";
  msg+="result = sum(6);\r\n";
  msg+="调用步骤 :\r\n";
  result=sum(6);
  msg+="计算结果 : \r\n";
  msg+="result = "+result+"\r\n";
  this.textBox1.Text += msg;
  }

  //计算当前步骤加和值
  public int sum(int m)
  {
  if(m==0)
  return 0;
  else
  {
  msg+="语句 : result = " +m+ "+sum(" +(m-1)+"); \r\n";
  int num = sum(m - 1); //问题:这里开始递归的,递归完后 m=0;走完这句的时候,接着下面的代码了
  result = m + num; //可是后来在最后的3句又开始循环了,m的值也开始由1递增到6了,不懂啊!
  } //高手帮忙分析下,谢谢~!
  return result;
  }
  }


------解决方案--------------------
正常,遇到终止条件m==0就开始逐步回填。一开始m = 6,int num = sum(5);所以要先取得sum(5)的返回值才能继续,而要求sum(5),又要先求sum(4),...这样一直到执行sum(0)时才得到返回值0,这样再取得sum(1)的返回值是1, sum(2)的返回值是2,...所以m的值一直递增到6。
这是递归的一个粗糙的描述。你可以看一看课本,特别是要弄清它的堆栈实现,这样对递归才算理解的比较准确。
递归很重要,特别是在Prolog和一些函数式编程语言里大量使用。