C# C语言中奇怪的委托行为#

C# C语言中奇怪的委托行为#,c#,delegates,functional-programming,C#,Delegates,Functional Programming,所以,我有一个负责拉格朗日多项式计算的代码。此代码大量使用委托(fn_结果声明为委托浮点fn_结果(float x)。乘法器(x)正确计算,尽管使用递归;但是,尝试计算多项式(x)会出现堆栈溢出异常。有人能告诉我为什么会这样吗?(注:多项式(x)已初始化:) 这一行有一个无限递归调用 polynom = y => (polynom(y) + multiplier(y)); 这一行有一个无限递归调用 polynom = y => (polynom(y) + multiplier(y)

所以,我有一个负责拉格朗日多项式计算的代码。此代码大量使用委托(fn_结果声明为
委托浮点fn_结果(float x)
乘法器(x)
正确计算,尽管使用递归;但是,尝试计算
多项式(x)
会出现堆栈溢出异常。有人能告诉我为什么会这样吗?(注:多项式(x)已初始化:)


这一行有一个无限递归调用

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

这一行有一个无限递归调用

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

正如@Eoin所说的,但实际上,
乘数和
多项式都是无限的

测试此示例:

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!
}
publicstaticvoidmain(字符串[]args)
{
Func f=x=>x*2+13;
f=x=>f(x)+1337;//调用自身,而不是原始函数
int res=f(1);//堆栈溢出!
}

这正是@Eoin所说的,但是
乘数和
多项式实际上都是无限的

测试此示例:

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!
}
publicstaticvoidmain(字符串[]args)
{
Func f=x=>x*2+13;
f=x=>f(x)+1337;//调用自身,而不是原始函数
int res=f(1);//堆栈溢出!
}

因为要计算
多项式(y)
,你首先要计算
多项式(y)
fn\u结果乘数=x=>Lagrange\u节点点[i]。y;
是你的强度
i
x
?因为要计算
多项式(y)
,你首先要计算
多项式(y)
fn\u结果乘数=x=>Lagrange\u节点点[i].Y;
是你的强度
i
还是
x
?行
乘数=x=>(乘数(x)*…
确实计算正确。要么我有一个非常深刻但有限的递归,要么我缺乏对函数编程的理解。@user2112311我确实怀疑,
乘法器
只是一个指针,在执行时它也会创建一个无限递归。它并不像您的代码所暗示的那样引用它以前的定义。line
multiplier=x=>(乘数(x)*…
确实计算正确。要么我有一个非常深刻但有限的递归,要么我缺乏对函数编程的理解。@user2112311我确实怀疑,
乘法器
只是一个指针,在执行时它也会创建一个无限递归。它并不像你的代码所暗示的那样引用它以前的定义。l不是吗你的代码中的ine 4称为函数式编程中的惰性求值?无论如何,我将尝试并重新生成我的代码。谢谢!@user2112311正是,欢迎:)代理非常强大,但强大的力量带来巨大的责任!你的代码中的第4行不是叫做函数式编程中的惰性评估吗?无论如何,我会尝试重新编写我的代码。谢谢!@user2112311,正是,欢迎:)代理非常强大,但强大的力量带来巨大的责任!