C# 是否可以将幂函数实现为lambda表达式?

C# 是否可以将幂函数实现为lambda表达式?,c#,lambda,C#,Lambda,我有一点空闲时间,所以开始在C#中摆弄lambda表达式,只是为了学习一些新的东西。 所以我从一个简单的平方函数开始: Func<int, int> square = x => x * x; Func square=x=>x*x; 正如我所预料的那样。接下来我尝试了这样的方法: Func<int, int> cube = x => x * x * x; Func<int, int> pow4 = x => square(x) * squa

我有一点空闲时间,所以开始在C#中摆弄lambda表达式,只是为了学习一些新的东西。 所以我从一个简单的平方函数开始:

Func<int, int> square = x => x * x;
Func square=x=>x*x;
正如我所预料的那样。接下来我尝试了这样的方法:

Func<int, int> cube = x => x * x * x;
Func<int, int> pow4 = x => square(x) * square(x);
Func<int, int, int> pow = (x,y) => ... // multiply x with itself, y-times  ;
bool condition = 1 > 0;
string result = (condition) ? ("Yes!") : ("No :-("); // Yes!

condition = 1 < 0;
string result2 = (condition) ? ("Yes!") : ("No :-("); // No :-( 
Func cube=x=>x*x*x;
Func pow4=x=>平方(x)*平方(x);
这也起到了预期的效果。然后我变得好奇,想做这样的事情:

Func<int, int> cube = x => x * x * x;
Func<int, int> pow4 = x => square(x) * square(x);
Func<int, int, int> pow = (x,y) => ... // multiply x with itself, y-times  ;
bool condition = 1 > 0;
string result = (condition) ? ("Yes!") : ("No :-("); // Yes!

condition = 1 < 0;
string result2 = (condition) ? ("Yes!") : ("No :-("); // No :-( 
Func-pow=(x,y)=>…/将x与自身相乘,y乘以;
我知道,有像y=0这样的情况需要关注,递归算法可以做到这一点,或者使用Math.pow()。 所以我的问题是:是否可以只使用lambda表达式来计算整数的幂?看起来怎么样

先行。

< P>(不考虑消极权力,无效率低效,<强>不做这件事!< /强>

迭代:

Func<int, int, int> pow = (x,y) => 
{
    if (y == 0)
        return 1;

    int result = x;
    for (int i = 1; i < y; i++)
    {
        result *= x;    
    }
    return result;
};
Func-pow=(x,y)=>
{
如果(y==0)
返回1;
int结果=x;
对于(int i=1;i
递归:

Func<int, int, int> pow = null;
pow = (x,y) => (y == 0) ? 1 : x * pow(x, y - 1);
Func-pow=null;
功率=(x,y)=>(y==0)?1:x*pow(x,y-1);

这是一种使用递归的方法

请注意,使用lambda表达式声明函数和从lambda表达式引发异常是C#7.0的特性

private int pow(int x, int y) 
        => 
        (y < 0) ? throw new ArgumentException("Negative exponent", nameof(y)) :
        (y == 0)  ? 1 :
        x * pow(x, y - 1);
private整数功率(整数x,整数y)
=> 
(y<0)?抛出新ArgumentException(“负指数”,nameof(y)):
(y==0)?1 :
x*pow(x,y-1);

这里是迭代解决方案(适用于
y>=1
):

我们可以用兰博达斯做同样的事情。所以不是
Func square=x=>x*x
,您可以编写
Func square=x=>{return x*x;}
。这允许我们编写更复杂的东西,比如循环


下面是递归解决方案(
y>=1
):

Func-pow=null;
功率=(x,y)=>
y==1?x
:x*pow(x,y-1);
我们使用一种叫做三元运算符的东西。它的工作原理如下:

Func<int, int> cube = x => x * x * x;
Func<int, int> pow4 = x => square(x) * square(x);
Func<int, int, int> pow = (x,y) => ... // multiply x with itself, y-times  ;
bool condition = 1 > 0;
string result = (condition) ? ("Yes!") : ("No :-("); // Yes!

condition = 1 < 0;
string result2 = (condition) ? ("Yes!") : ("No :-("); // No :-( 
bool条件=1>0;
字符串结果=(条件)?(“是的!”):(“否:-(”);//是的!
条件=1<0;
字符串result2=(条件)?(“是!”):(“否:-”();//否:-(
(注意,在这种情况下不需要括号)


我们可以使用它来使用if语句,而不使用代码块
{…}
。但是要真正调用lambda本身,需要首先定义它。lambda尚未在它的主体中定义,因此我们需要在开始编写主体之前定义它。解决方案是分配
null
(或其他)你允许什么,你不允许什么?要么是递归的,迭代的,要么是调用Math.Pow.lambda表达式只是“语法糖”——没有什么能阻止你编写复杂的函数。但是为什么不使用实函数呢?你允许
*
(恰好有一个内置运算符),但不允许'Math.Pow(目前没有内置运算符),那么这与lambda表达式没有任何关系?这只是“如何在不使用
Math.Pow
的情况下实现Math.Pow?”这对你来说可能也很有趣,因为你想知道数学是如何工作的。Pow:谢谢,我尝试了类似于你的递归解的方法。我想我很早就放弃了,错过了“Pow=null”部分。我想直到这个问题我对lambdas有点错误的理解。你的回答对我的理解很有帮助,谢谢。