【问题标题】:weird delegate behavior in C#C# 中奇怪的委托行为
【发布时间】:2013-09-14 06:29:42
【问题描述】:

所以,我有负责拉格朗日多项式计算的代码。此代码大量使用委托(fn_result 声明为 delegate float fn_result (float x)。尽管使用了递归,但 multiplier(x) is 已正确计算;但是,尝试计算 polynom(x) 会提供堆栈溢出异常。请有人告诉我为什么会这样?(注意:polynom(x) 已初始化:)

fn_result polynom = x => 0.0f;
for (int i = 0; i != Lagrange_node_points.Length; i++)
{
    fn_result multiplier = x => Lagrange_node_points[i].Y;
    for (int k = 0; k != Lagrange_node_points.Length; k++) // p[k] cycle
        if (k != i)
            multiplier = x => (multiplier(x) * (x - Lagrange_node_points[k].X) / (Lagrange_node_points[i].X - Lagrange_node_points[k].X));
    polynom = y => (polynom(y) + multiplier(y));
}

【问题讨论】:

  • 因为要计算polynom(y),所以先计算polynom(y)?
  • fn_result multiplier = x => Lagrange_node_points[i].Y; 是你的内涵i 还是x

标签: c# delegates functional-programming


【解决方案1】:

你在这一行有一个无限递归调用。

polynom = y => (polynom(y) + multiplier(y));

【讨论】:

  • multiplier = x => (multiplier(x) * ... 行确实计算正确。要么我有非常深但有限的递归,要么我缺乏对函数式编程的理解。
  • @user2112311 我确实怀疑multiplier 只是一个指针,在执行时它也会创建一个无限递归。正如您的代码似乎暗示的那样,它并不是指它以前的定义。
【解决方案2】:

正如@Eoin 所说,但multiplierpolynom 实际上都是无限的。

测试这个例子:

public static void Main(string[] args) 
{
  Func<int,int> f = x => x * 2 + 13;
  f = x => f(x) + 1337; // Calling itself, not the original function
  int res = f(1); // Stack overflow!
}

【讨论】:

  • 代码中的第 4 行不是在函数式编程中称为惰性求值吗?无论如何,我会尝试重新制作我的代码。谢谢!
  • @user2112311 没错,不客气 :) 代表很强大,但权力越大,责任越大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多