You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅用Lambda表达式实现C#中的整数幂函数?

用纯Lambda表达式实现整数幂函数

当然可以!咱们完全不用依赖Math.Pow或者额外的外部方法,只靠Lambda表达式就能实现支持边界情况的整数幂函数,核心思路是用递归Lambda——不过因为C#的编译器特性,得先小技巧处理一下自引用的问题。

基础实现(处理边界情况)

最直观的写法是先声明委托变量并初始化为null,再赋值递归逻辑的Lambda,这样Lambda内部就能引用自身了:

Func<int, int, int> pow = null;
pow = (x, y) => 
    y switch
    {
        < 0 => throw new ArgumentOutOfRangeException(nameof(y), "幂次不能为负数"),
        0 => x == 0 ? throw new ArgumentException("0的0次幂在数学上无定义") : 1,
        1 => x,
        _ => x * pow(x, y - 1)
    };

逻辑说明:

  • 先拦截负数幂次:整数的负次幂会得到分数,不符合咱们的整数输出要求,直接抛异常
  • 处理0次幂:数学上任何非0数的0次幂都是1;0的0次幂是未定义的,这里加了判断抛出异常(你也可以根据需求改成返回1,看业务场景)
  • 1次幂直接返回原数,避免多余递归
  • 其他情况递归调用自身,逐步相乘

更简洁的三元运算符版本

如果你偏爱紧凑的写法,也可以用三元运算符替代switch表达式:

Func<int, int, int> pow = null;
pow = (x, y) => 
    y < 0 ? throw new ArgumentOutOfRangeException(nameof(y), "幂次不能为负数") :
    y == 0 ? (x == 0 ? throw new ArgumentException("0^0无定义") : 1) :
    y == 1 ? x :
    x * pow(x, y - 1);

进阶:用Y组合子实现纯匿名递归(可选)

如果不想显式声明委托变量,还可以用函数式编程里的Y组合子来实现完全匿名的递归Lambda,不过这个写法偏进阶,适合深入理解函数式思想:

// 先实现支持双参数的Y组合子
Func<Func<Func<int, int, int>, Func<int, int, int>>, Func<int, int, int>> Y2 = f => f((x, y) => Y2(f)(x, y));

// 用Y2定义幂函数
var pow = Y2(self => (x, y) =>
    y < 0 ? throw new ArgumentOutOfRangeException(nameof(y)) :
    y == 0 ? (x == 0 ? throw new ArgumentException("0^0无定义") : 1) :
    x * self(x, y - 1));

这个写法完全不需要提前声明委托变量,靠Y组合子实现Lambda的自引用,但日常开发里第一种写法已经足够清晰易用了。

内容的提问来源于stack exchange,提问作者CaptainRedbeard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:56:46