我正在尝试编写一个for循环,我必须以指数方式递增。我使用stride
功能但它不起作用。这是c ++代码,我正在尝试编写一个快速版本。
for (int m = 1; m <= high - low; m = 2*m){}
你可以帮助我,在swift版本中编写这段代码吗?
while循环可能是最简单的解决方案,但这里有一个替代方案:
for m in sequence(first: 1, next: { 2 * $0 }).prefix(while: { $0 <= high - low }) {
print(m)
}
sequence()
(懒惰地)生成序列1,2,4,...,并且prefix(while:)
将该序列限制在给定范围内。
这种方法的一个小优点是m
只在循环内声明(因此以后不会意外使用),这是一个常量,因此不能在循环内无意中修改它。
Swift中没有for
循环,但你可以用基本的while
循环实现相同的结果
var m = 1 // initializer
while m <= high - low { // condition
...
m *= 2 // iterator
}
基于@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
这是使用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)