使用kotlin中的高阶函数打印素数时出错

时间:2017-08-11 19:41:19

标签: kotlin

val listNumbers = generateSequence(1) { it + 1 }
val listNumber1to100 = listNumbers.takeWhile { it < 100 }
val secNum:Unit = listNumber1to100.forEach {it}

println(listNumber1to100.asSequence().filter { it%(listNumber1to100.forEach { it })!=0 }.toList())

我在提醒标志中有错误! 这是错误:使用提供的参数

无法调用以下任何函数

1 个答案:

答案 0 :(得分:0)

在第一种方法中,错误出现在此行中:

it%(listNumber1to100.forEach { it })

Byte运算符之后,首先DoubleFloatIntLongShort%但是,forEach是一个返回类型为Unit的函数。

在第二种方法中,您在isPrime(Int)中有正确的表达方式。以下是一些建议:

  1. listNumber1to100在您的代码中排除100,如果您想在listNumber1to100中包含100,则传递给takeWhile的lambda应更改为:

    val listNumber1to100 = listNumbers.takeWhile { it <= 100 }
    
  2. listNumber1to100.asSequence()在这里是多余的,因为listNumber1too100本身就是TakeWhileSequence,它实现了Sequence

  3. isPrime(Int)有点混乱,因为它检查isComposite并且它不适用于它所采用的每一个输入(它仅适用于1到99)。我将以这种方式重写它:

    fun isPrime(num: Int): Boolean = if (num <= 1) false else !(2..num/2).any { num % it == 0 }
    

    由于素数必须为正数且1是特殊情况(既不是素数也不是复合数),如果输入小于或等于1,则只返回false。如果不是,则检查输入是否可被整除数字范围从2到(输入/ 2)。范围在(输入/ 2)之前结束,因为如果num % (num/2) == 0为真,则num % 2 == 0也是如此,反之亦然。最后,我在此之前添加了!运算符,因为素数不应该被任何这些数字整除。

    最后,您可以按isPrime(Int)过滤列表:

    println(listNumber1to100.filter(::isPrime).toList())
    

    PS。它仅供参考,必须有比这更好的实现。

  4. 要回答关于it的问题,it表示lambda表达式中唯一的lambda参数。它始终用于function literal which has only one parameter