Swift幂运算
Swift幂运算

Swift幂运算

在 Swift 中,幂运算(Power) 主要通过使用 pow 函数来完成,但 Swift 并不支持使用 ^ 作为幂运算符(^ 在 Swift 中是按位异或操作)。

使用 pow 进行幂运算

import Foundation

let result = pow(2.0, 3.0) // 2 的 3 次方
print(result) // 输出 8.0

注意: pow 返回的是 Double 类型,如果需要其他类型,可以进行类型转换。

let resultInt = Int(pow(2.0, 3.0)) // 转成 Int
print(resultInt) // 输出 8

自定义幂运算运算符(**)

如果希望使用更方便的运算符,例如 **,可以自定义一个运算符:

import Foundation

infix operator **: MultiplicationPrecedence

// 定义 `**` 运算符
func ** (base: Double, exponent: Double) -> Double {
    return pow(base, exponent)
}

// 也可以为 Int 类型扩展
func ** (base: Int, exponent: Int) -> Int {
    return Int(pow(Double(base), Double(exponent)))
}

// 示例
let doubleResult = 2.0 ** 3.0
print(doubleResult) // 输出 8.0

let intResult = 3 ** 4
print(intResult) // 输出 81

快速幂运算(递归实现)

如果需要更高效的整数幂运算,可以使用快速幂算法:

func fastPower(_ base: Int, _ exponent: Int) -> Int {
    if exponent == 0 {
        return 1
    }
    let half = fastPower(base, exponent / 2)
    if exponent % 2 == 0 {
        return half * half
    } else {
        return half * half * base
    }
}

// 示例
print(fastPower(2, 10)) // 输出 1024

详细推算

第一次调用:fastPower(2, 10),exponent = 10,half = fastPower(2, 10 / 2)。

第二次调用:fastPower(2, 5),exponent = 5,half = fastPower(2, 5 / 2),5 / 2 = 2(整数除法向下取整)。

第三次调用:fastPower(2, 2),exponent = 2,half = fastPower(2, 2 / 2)。

第四次调用:fastPower(2, 1),exponent = 1,half = fastPower(2, 1 / 2),1 / 2 = 0(整数除法向下取整)。

第五次调用:fastPower(2, 0),exponent = 0,half = fastPower(2, 0),直接返回1。

从最底层往上计算

fastPower(2, 0) = 1

fastPower(2, 1) = 1 * 1 * 2 = 2

fastPower(2, 2) = 2 * 2 = 4

fastPower(2, 5) = 4 * 4 * 2 = 32

fastPower(2, 10) = 32 * 32 = 1024

奇偶性不同的问题

if exponent % 2 == 0 {
    return half * half
} else {
    return half * half * base
}

奇偶性之所以不同,是因为指数分解时,幂运算的性质导致不同情况需要不同处理。

如果 exponent 是偶数,可以直接拆成两个相同的幂相乘,比如 2^10:

我们可以直接把 10 一分为二,变成 5,递归计算 2^5,然后将结果平方即可。

但如果 exponent 是奇数,直接对 exponent / 2 取整,会丢失一个 base,所以要额外乘以 base,比如 2^5:

5 不能直接一分为二得到整数,所以要写成 5 = 2 \times 2 + 1。

这就意味着:多出来一个 base,需要额外乘上 base。

所以 2^5 其实是 2^4 之后再乘以一个 2。

Swift 幂运算的常见用法

1、计算平方、立方

let square = pow(4.0, 2.0) // 4 的平方
let cube = pow(3.0, 3.0)   // 3 的立方
print(square, cube) // 16.0 27.0

2、计算平方根

let squareRoot = pow(9.0, 0.5)
print(squareRoot) // 输出 3.0

3、负指数(取倒数)

let inverse = pow(2.0, -1.0)
print(inverse) // 输出 0.5

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注