C#递归,从递归方法调用其他方法返回错误的值

时间:2018-02-23 10:06:35

标签: c# recursion

这是我的代码

private double wordcompare(word a, word b)
{    
     if (a.AtTheEndOf(b))
         return -1;
     double matchPer=word.Compare( a,b);
     Console.WriteLine(matchPer);
     a.shiftToleft();
     double nextMatchPer = wordcompare(a, b);
     return matchPer > nextMatchPer ? matchPer : nextMatchPer;
}

Compare()方法比较2个单词并返回匹配字母的百分比 shifttoleft()方法将比较的单词虚拟地移动一步, 我已经调试了每一步,当它到达Compare()的返回时有2/3或1/3的数字,但是当我打印返回的值时它显示0除了第一个呼叫帮助请。

word class

class word
{
    public static double Pertolarnce = 0.2;

    private int pos;
    public int wordTolarnce;
    string letters;

    public int Pos {  get{ return pos; }  }
    public word(string s)
    {
        letters = s;
        wordTolarnce=(int)Math.Round(Pertolarnce * s.Length, MidpointRounding.AwayFromZero) ;
        pos = 0 - wordTolarnce;
    }


    public void shiftToleft()
    {
        pos++;
    }

    public int Len { get { return letters.Length; } }

    public static double Compare(word a,word w)
    {
        int comLeters = 0;
        int matchedLeters = 0;
        int i, j;
        i = 0 - a.pos;
        j = 0 + a.pos;
        i=i < 0 ? 0 : i;
        j=j < 0 ? 0 : j;
        while(i<a.Len && j<w.Len )
        {
            comLeters++;
            if (a.letters[i] == w.leterAt(j))
                matchedLeters++;
            i++;
            j++;
        }
        return matchedLeters / comLeters;
    }

    private char leterAt(int index)
    {
        return letters[index];
    }

    public bool AtTheEndOf(word w)
    {
        if(w.Len-this.pos+1 == this.Len-wordTolarnce)
        return true;
        else
            return false;
    }
}

的输出
    Console.WriteLine(matchPer);
    1
    0
    0
    0
    0
    0

1 个答案:

答案 0 :(得分:1)

你的问题是整数除法。 matchedLeters / comLeters将执行整数除法,这意味着将丢弃任何余数。这意味着,如果matcheLeters小于comLeters,则会在您看到后返回0。

要解决此问题,您可以执行以下操作:

return (double)matchedLeters / comLeters;

这将在分割之前将matchedLeters转换为双精度,这将强制它使用浮点除法。

作为调试提示,如果您已完成(用于调试),您可能已经对问题有了更多了解:

var retVal = matchedLeters/comLeters;
return retVal;

这样可以让您确切了解导致问题的操作。