1

我需要实现一个程序,其中我将有一个基本变量x及其扩展等exp(x), ln(x), exp(5ln(x))。我曾想过有一个 interface IExtensible,但我不确定如何实现这些变量。我考虑过的选项是使用一些列表来保持扩展的顺序和类型。但我不确定这种实现是否容易处理:我需要将这些扩展用作有理函数中的变量。

编辑:我添加了我最后需要的一个小样本:

x^2 + 3exp(ln(2x)) - ln(x^4)

这种表达式被传递给F将执行一些计算的函数。该函数F需要确切地知道有哪些扩展。

4

3 回答 3

2

您需要的是一个数学解析器,碰巧我为 .NET 创建了一个数学解析器,您可以从这里下载它。它具有完整的源代码,它允许您设置自定义委托函数来创建内置操作。此外,它具有变量支持,因此您可以定义一个变量(例如x在您的示例中),并且您可以使该变量等于您想要的任何内容。看看这个

于 2012-05-06T18:04:59.537 回答
1

您可能正在寻找类似NCalc的东西。

于 2012-05-06T18:04:27.867 回答
0

很难收集你在这里问的到底是什么,但听起来你可能想使用一些匿名函数来定义你的“扩展”,然后你可以像你说的那样将它们存储在一个查找表中:

这是一些基本的示例代码,带有一个递归示例,以演示该想法:

Func<long,long> sqr = 
    ( x ) => 
    { 
        return x * x;
    };

Func<long,long> factoral = 
    ( n ) =>
    {
        return n > 1 ? 
            n * ( long )( MethodInfo.GetCurrentMethod().Invoke( null, new object[] { n - 1 } ) ) :
            n;
    };

var DataObjects = new []
{
    new { Name = "sqr(1)!", Value = factoral( sqr( 1 ) ) },
    new { Name = "sqr(2)!", Value = factoral( sqr( 2 ) ) },
    new { Name = "sqr(3)!", Value = factoral( sqr( 3 ) ) },
    new { Name = "sqr(4)!", Value = factoral( sqr( 4 ) ) },
    new { Name = "sqr(5)!", Value = factoral( sqr( 5 ) ) },
};

DataObjects.ToList().ForEach
(
    d =>
        Console.WriteLine( d )
);

产生输出:

命名 sqr(1)!值 1

命名 sqr(2)!价值 24

命名 sqr(3)!价值 362880

命名 sqr(4)!价值 20922789888000

命名 sqr(5)!价值 7034535277573963776

希望这可以帮助,

于 2012-05-06T17:35:48.740 回答