【问题标题】:Is it possible to implement the power function as a lambda expression?是否可以将幂函数实现为 lambda 表达式?
【发布时间】:2019-08-19 20:59:51
【问题描述】:

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

Func<int, int> 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  ;

我知道,有像 y = 0 这样的情况需要关心,递归算法可以做到这一点或使用 Math.pow()。 所以我的问题是:是否可以仅使用 lambda 表达式来计算整数的幂?它看起来怎么样?

提前致谢。

【问题讨论】:

  • 你允许什么,你不允许什么?它要么必须是递归的、迭代的,要么调用 Math.Pow。
  • lambda 表达式只是“语法糖”——没有什么能阻止你编写复杂的函数。但是为什么不使用真正的函数呢?
  • 您允许*(恰好有一个内置运算符),但不允许`Math.Pow(没有发生(目前)是一个内置运算符)
  • 那和 lambda 表达式没有任何关系?那只是“如何在不使用 Math.Pow 的情况下实现 Math.Pow?”
  • 这可能对您来说也很有趣,因为您想知道 Math.Pow 是如何工作的:stackoverflow.com/a/8870593/9338645

标签: c# lambda


【解决方案1】:

(不考虑负面力量,效率低下,不要这样做!

迭代:

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<int, int, int> pow = null;
pow = (x,y) => (y == 0) ? 1 : x * pow(x, y - 1);

【讨论】:

  • 谢谢,我尝试了类似你的递归解决方案。我想我早早放弃了,错过了“pow = null”部分
【解决方案2】:

这是一种使用递归的方法。

请注意,使用 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);

【讨论】:

    【解决方案3】:

    这是迭代解决方案(适用于y&gt;=1):

            Func<int, int, int> pow = (x, y) =>
            {
                int result = 1;
                for (int i = 0; i < y; i++)
                {
                    result *= x;
                }
                return result;
            };
    

    这里我们使用它而不是一个语句(例如x =&gt; x * x),我们可以定义代码块(x =&gt; { ...; ...; ...; })。如果你仔细想想,这和我们已经用方法做的事情完全一样!

    static int ReturnFour() => 4;
    
    static int ReturnFour() {
        return 4;
    }
    

    我们可以用 lambdas 做同样的事情。所以你可以写Func&lt;int, int&gt; square = x =&gt; { return x * x; },而不是Func&lt;int, int&gt; square = x =&gt; x * x;。这让我们可以编写更复杂的东西,比如循环。


    这是递归解决方案(y&gt;=1):

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

    我们使用一种叫做三元运算符的东西。它的工作原理是这样的:

    bool condition = 1 > 0;
    string result = (condition) ? ("Yes!") : ("No :-("); // Yes!
    
    condition = 1 < 0;
    string result2 = (condition) ? ("Yes!") : ("No :-("); // No :-( 
    

    (注意在这种情况下括号是不必要的)

    我们可以使用它来使用没有代码块{ ... } 的 if 语句。但要真正调用 lambda 本身,需要先定义它。 Lambda 尚未在其主体中定义,因此我们需要在开始编写主体之前定义它。解决方案是先将null(或其他)分配给它。

    【讨论】:

    • 我认为直到这个问题我对 lambdas 的理解有点错误。您的回答对我的理解很有帮助,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多