反正有指数级快速增长吗?

时间:2019-04-03 13:05:44

标签: swift for-loop increment

我正在尝试编写一个for循环,在这里我必须按指数递增。我正在使用stride函数,但是无法正常工作。 这是c ++代码,我正在尝试编写一个快速版本。

for (int m = 1; m <= high - low; m = 2*m){}

您能帮我快速编写此代码吗?

4 个答案:

答案 0 :(得分:6)

while循环可能是最简单的解决方案,但这是替代方案:

for m in sequence(first: 1, next: { 2 * $0 }).prefix(while: { $0 <= high - low }) {
    print(m)
}

sequence()(懒惰地)生成序列1、2、4,...,而prefix(while:)将序列限制为给定范围。

此方法的一个小优点是m仅在循环内部声明(这样以后就不会意外使用),并且它是一个常量,因此它不能会在循环内无意中被修改。

答案 1 :(得分:3)

在Swift中没有for循环,但是您可以通过基本的while循环实现相同的结果

var m = 1                // initializer
while m <= high - low {  // condition
    ...
    m *= 2               // iterator
}

答案 2 :(得分:1)

基于@MartinR answer,唯一的改进就是通话的可读性:

// Helper function declaration
func forgen<T>(
    _ initial: T, // What we start with
    _ condition: @escaping (T) throws -> Bool, // What to check on each iteration
    _ change: @escaping (T) -> T?, // Change after each iteration
    _ iteration: (T) throws -> Void // Where actual work happens
    ) rethrows
{
    return try sequence(first: initial, next: change).prefix(while: condition).forEach(iteration)
}

// Usage:
forgen(1, { $0 <= high - low }, { 2 * $0 }) { m in
    print(m)
}
// Almost like in C/C++ code

答案 3 :(得分:0)

这是使用for的解决方案:

let n = Int(log(Double(high - low))/log(2.0)) 
var m = 1
for p in 1...n {
    print("m =", m)
    ...
    m = m << 1
}

(假设high - low大于2)