【问题标题】:Why do these methods recurse infinitely?为什么这些方法会无限递归?
【发布时间】:2020-12-28 02:49:34
【问题描述】:

我一直在开发一个创建有理数的程序,当我调用这些方法中的任何一个时,我都会从递归中得到堆栈溢出。

public Rational(){
      new Rational(0,1);
}
public Rational(int n){
      new Rational(n,1);
}
public Rational(int numerator, int denominator){
      new Rational(numerator,denominator);
}

谁能解释一下为什么这些方法会无限递归?

【问题讨论】:

  • 因为您的构造函数尝试创建一个新对象,然后创建另一个对象,这......
  • 首先没有数学。你不想要分子/分母吗?你什么时候停下来?您正在调用 new Rational(numerator,denominator);一遍又一遍。
  • 另外这绝对不是你委托构造函数调用的方式,你是从哪里学会这样写构造函数的?

标签: c# recursion methods void


【解决方案1】:

这些不仅仅是任何方法,它们是构造函数,并且像这样以递归方式调用它们几乎肯定不是你想要的。例如。当您调用第一个构造函数时,它会创建两个新对象(this 加上构造函数主体中的新 Rational,它调用另一个,它调用另一个......)

回答您的问题:当您的第三个构造函数运行时,它会调用自身。没有结束递归的基本情况,所以它会一直递归直到堆栈溢出。

【讨论】:

    【解决方案2】:
    public Rational(int numerator, int denominator){
          new Rational(numerator,denominator);
    }
    

    这个构造函数用它给定的参数调用它自己。除非我遗漏了一些东西(C# 不是我非常熟悉的语言),否则你永远不会退出函数,你只会不断产生更多Rationals。您的构造函数应该看起来像这样。

    public Rational(){
        numerator = 0;
        denominator = 1;
    }
    public Rational(int n){
        numerator = n;
        denominator = 1;
    }
    public Rational(int n, int d){
        numerator = n;
        denominator = d;
    }
    

    【讨论】:

    • 我认为如果前两个构造函数链接到第三个构造函数会更好......
    【解决方案3】:

    new 将创建一个新实例,它不会继续初始化当前对象。所以你有一个递归调用,构造函数创建一个新实例,它创建一个新实例等。

    我认为您正在寻找的是:

    namespace ConsoleApp18
    {
        public class Rational
        {
            // A
            public Rational() : this(0, 1) // Calls C
            {
            }
    
            // B
            public Rational(int n) : this(n, 1) // Calls C
            {
            }
    
            // C
            public Rational(int numerator, int denominator)
            {
                // Init here
            }
        }
    }
    
    

    也可以这样链接:

    namespace ConsoleApp18
    {
        public class Rational
        {
            // A
            public Rational() : this(0) // Calls B
            {
            }
    
            // B
            public Rational(int n) : this(n, 1) // Calls C
            {
            }
    
            // C
            public Rational(int numerator, int denominator)
            {
                // Init here
            }
        }
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多