A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 徐晓磊 于 2012-4-20 11:47 编辑
  1. public class RecursionTest{

  2.   private RecursionTest rt;
  3.         public RecursionTest(){
  4.         //        rt = new RecursionTest();
  5.                 rt = this;
  6.                
  7.         }
  8.         
  9.         public static void main(String[] args)        {
  10.                 new RecursionTest();
  11.         }
  12. }
  13. 关于这个类,在定义时候使用自身类型定义变量。
  14. 执行过程到底是怎么样的,为什么构造方法中两种初始化都会报错
复制代码

10 个回复

倒序浏览
你这个不是递归吧
回复 使用道具 举报
蒙武辉 发表于 2012-4-20 11:47
你这个不是递归吧

注释的那句怎么不是递归定义呢
回复 使用道具 举报
个人理解:这个不是递归;楼主的两个错误时相同的,既然在本类中已经将Demo私有化了;外部怎么能创建了。
回复 使用道具 举报
zhaishuang 发表于 2012-4-20 12:15
个人理解:这个不是递归;楼主的两个错误时相同的,既然在本类中已经将Demo私有化了;外部怎么能创建了。 ...

类体本身是public的啊 怎么不能够创建呢
回复 使用道具 举报
注释那句是初始化
回复 使用道具 举报
蒋亮 中级黑马 2012-4-20 13:39:31
7#
public RecursionTest(){
//rt = new RecursionTest();
rt = this;        
}
想不通,你怎么会突发奇想在构造方法中使用递归,就算你用,你这也是个无限递归啊,另外这个rt=this压根就没什么意义。

回复 使用道具 举报
徐晓磊 发表于 2012-4-20 12:26
类体本身是public的啊 怎么不能够创建呢

单例设计模式中类体也是public的,我运行了你的代码,看了上面的提示。说RecursionTest类是公共的,应在RecursionTest.java的文件中声明public class RecursionTest;所以我推测私有了之后才不能创建对象。
回复 使用道具 举报
在构造函数中使用递归,lz本意是要干嘛啊?
回复 使用道具 举报
楼主先看看这个,会有帮助

递归函数,即是调用一个函数的过程中出现直接或简介的调用该函数本身.此种函数就称为递归函数
  递归函数的优点是程序简洁易懂,可读性强;缺点是需要调用大量的函数调用,消耗大量的内存和时间
  一般来说,递归由函数出口和递归体两部分组成,递归出口给出了递归终止条件,递归体给出了递归的方式.

  下面一例就是简单的递归:
求N的阶乘,即求1乘2乘3一直乘到N的乘积.
递归形式如下:
f(1)=1
f(n)=f(n-1)*n
前者就是递归的出口,后者就是递归体
程序执行过程为:求f(4)反推到f(3),再反推到f(3),接着反推到f(2),最后反推到f(1),此时遇到递归出口,计算出f(1)=1,然后依次反推.f(2)=2*f(1)=2,f(3)=3*f(2)=3*2=6,f(4)=4*f(3)=4*6=24
程序代码实现:
import javax.swing.JOptionPane;
public class N {
static int f(int x){
  int s;
  if(x==1)
   s=1;
  else
   s=f(x-1)*x;
  return s;
}
public static void main(String[] args) {
  int n;
  N f=new N();
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  System.out.print(N.f(n));
}
}
下面是一个很典型的递归解决的问题,如果用其他方法编写,代码将很繁琐
汉罗塔问题:有N个大小不同的盘片放在A柱上(小的在上,大的在下),另有BC两柱.要求将这N个盘片从A搬到C上,搬动中,每次只能搬动一个盘片,而且小盘片不能放在大盘片之下
程序思想:假如要移动N个盘片,如果能先将上面的N-1个盘片从A借助C移到B上,那么再将最后那个盘片移到C上,然后在把N-1个盘片从B借助A移到C上,那么就行了
代码如下
import javax.swing.JOptionPane;
public class Hanio {
static void nuodong(int n,char A,char B,char C){
  if(n==1)
   System.out.print("move"+n+"from"+A+"to"+C+"\n");
  else{
   nuodong(n-1,A,C,B);
   System.out.print("move"+n+"from"+A+"to"+C+"\n");
   nuodong(n-1,B,A,C);
  }
}
public static void main(String[] args) {
  int n;
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  char A='A',B='B',C='C';
  Hanio h=new Hanio();
  Hanio.nuodong(n,A,B,C);
}
}

下面这个斐波那契数列也是用递归实现的(摘抄自其他网站)
斐波那契数列问题:列第n项,斐波那契数列第一和第二项是1,后面每一项是前两项之和,即1、1、2、3、5、8、13
import javax.swing.JOptionPane;
public class Fibonacci
{
int F(int n)
{
  if(n==0)
   return 1;
  else if(n==1)
   return 1;
  else if(n>1)
   return F(n-1)+F(n-2); /*递归*/
  else
   JOptionPane.showMessageDialog(null,"方程无解!");
   return 0;
}
public static void main(String[] args)
{
  int i,n,m;
  Fibonacci f=new Fibonacci();
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  for(i=0;i<=n;i++)
  {
   m=f.F(i);
   System.out.println(m);
  }
}
}
回复 使用道具 举报
本帖最后由 yuanshilieshou 于 2012-4-20 17:32 编辑

第一个rt=new(),构造函数一直调用自己,是死的
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
      at Person.<init>(Person.java:5)
\ja\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013>
第二个应该没问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马