当前位置:  开发笔记 > IOS > 正文

for循环使用Swift中的where子句

如何解决《for循环使用Swift中的where子句》经验,为你挑选了1个好方法。

我试图将一个小函数更新为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)定义从ato 运行的范围b,并包括值ab.值a不得大于b.

root已分配sqrt(n),这意味着为了使2...root范围保持有效,n必须高于2 2.

您可以通过提供右侧的下限来修复,即

for div in 2...max(root,2) where n % div == 0 {
    ...
}

但是,此时使用常规for循环的解决方案更具可读性.



1> dasblinkenli..:

当你3转到时sigma,你的范围2...root变得无效,因为左边的root,小于右边,2.

闭区域运算符(a...b)定义从ato 运行的范围b,并包括值ab.值a不得大于b.

root已分配sqrt(n),这意味着为了使2...root范围保持有效,n必须高于2 2.

您可以通过提供右侧的下限来修复,即

for div in 2...max(root,2) where n % div == 0 {
    ...
}

但是,此时使用常规for循环的解决方案更具可读性.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有