递归函数的迭代函数

时间:2017-03-31 09:23:46

标签: c# recursion

上下文

这是尝试将温度转换为其他单位的功能 我想将ConvertConv合并为递归函数。

Convert将所有内容从输入单位转换为参考单位(°C),然后转换为所需单位 这样只需存储转换公式到°C单位和°C Nb:参考单位应为SI单位°K。但是为了理解,在这个例子中我使用了°C。

代码:

此功能转换为:

  • double value,作为转换价值
  • tempUnits fromUnit,从此单位转换。
  • tempUnits toUnit,转换为此单元。

public double Convert(double value, tempUnits fromUnit, tempUnits toUnit) {
    if (toUnit == tempUnits.C)
        return Conv(value, fromUnit, toUnit);

    if (toUnit != tempUnits.C && fromUnit != tempUnits.C)
    {
        double temp = Conv(value, fromUnit, tempUnits.C);
        return Conv(temp, tempUnits.C, toUnit);
    }

    if (fromUnit != tempUnits.C)
        return Conv(value, fromUnit, tempUnits.C);

    return Conv(value, tempUnits.C, toUnit);
}


double Conv(double value, tempUnits fromUnit, tempUnits toUnit) {
    return conversionsTable.Where(x => x.From == fromUnit && x.To == toUnit).First().Formule(value);
}

static List<Conversion> conversionsTable
    = new List<Conversion> {
        // From °C To X :
        new Conversion( tempUnits.C,    tempUnits.F,    (temp) => temp * (9.0/5.0) + 32.0 )
        , new Conversion( tempUnits.C,  tempUnits.K,    (temp) => temp + 273.15)
        , new Conversion( tempUnits.C,  tempUnits.R,    (temp) => (temp + 273.15)*(9.0/.05) )
        , new Conversion( tempUnits.C,  tempUnits.De,   (temp) => (100-temp)*(3.0/2.0) )
        , new Conversion( tempUnits.C,  tempUnits.N,    (temp) => temp+(33.0/100.0) )
        , new Conversion( tempUnits.C,  tempUnits.Re,   (temp) => temp * (4.0/5.0)  )
        , new Conversion( tempUnits.C,  tempUnits.Ro,   (temp) => temp * (21.0/40.0) + 7.5 )

        // From X To °C :
        , new Conversion( tempUnits.F,  tempUnits.C,   (temp) => (temp-32.0)*(5.0/9.0) )
        , new Conversion( tempUnits.K,  tempUnits.C,   (temp) => temp-273.15 )
        , new Conversion( tempUnits.R,  tempUnits.C,   (temp) => (temp-491.67)*(5.0/9.0) )
        , new Conversion( tempUnits.De, tempUnits.C,   (temp) => 100-temp*2.0/3.0)
        , new Conversion( tempUnits.N,  tempUnits.C,   (temp) => temp*100.0/33.0 )
        , new Conversion( tempUnits.Re, tempUnits.C,   (temp) => temp*5.0/4.0 )
        , new Conversion( tempUnits.Ro, tempUnits.C,   (temp) => (temp-7.5)*40.0/21.0 )
    };

class Conversion {
    internal tempUnits From;
    internal tempUnits To;
    internal Func<double, double> Formule;

    public Conversion(tempUnits from, tempUnits to, Func<double, double> formule) {
        From = from; To = to; Formule = formule;
    }
}

enum tempUnits { C, F, K, R, De, N, Re, Ro }

0 个答案:

没有答案