我试图将一个小函数更新为Swift 2.1.原始工作代码是:
import func Darwin.sqrt func sqrt(x:Int) -> Int { return Int(sqrt(Double(x))) } func sigma(n: Int) -> Int { // adding up proper divisors from 1 to sqrt(n) by trial divison if n == 1 { return 0 } // definition of aliquot sum var result = 1 let root = sqrt(n) for var div = 2; div <= root; ++div { if n % div == 0 { result += div + n/div } } if root*root == n { result -= root } return (result) } print(sigma(10)) print(sigma(3))
更新for循环后,我得到最后一行的运行时错误.知道为什么会这样吗?
import func Darwin.sqrt func sqrt(x:Int) -> Int { return Int(sqrt(Double(x))) } func sigma(n: Int) -> Int { // adding up proper divisors from 1 to sqrt(n) by trial divison if n == 1 { return 0 } // definition of aliquot sum var result = 1 let root = sqrt(n) for div in 2...root where n % div == 0 { result += div + n/div } if root*root == n { result -= root } return (result) } print(sigma(10)) print(sigma(3)) //<- run time error with for in loop
dasblinkenli.. 6
当你3
转到时sigma
,你的范围2...root
变得无效,因为左边的root
,小于右边,2
.
闭区域运算符
(a...b)
定义从a
to 运行的范围b
,并包括值a
和b
.值a
不得大于b
.
root
已分配sqrt(n)
,这意味着为了使2...root
范围保持有效,n
必须高于2 2.
您可以通过提供右侧的下限来修复,即
for div in 2...max(root,2) where n % div == 0 { ... }
但是,此时使用常规for
循环的解决方案更具可读性.
当你3
转到时sigma
,你的范围2...root
变得无效,因为左边的root
,小于右边,2
.
闭区域运算符
(a...b)
定义从a
to 运行的范围b
,并包括值a
和b
.值a
不得大于b
.
root
已分配sqrt(n)
,这意味着为了使2...root
范围保持有效,n
必须高于2 2.
您可以通过提供右侧的下限来修复,即
for div in 2...max(root,2) where n % div == 0 { ... }
但是,此时使用常规for
循环的解决方案更具可读性.