Kotlin 如何改变程序,通过序列中的数字来寻找一个完美的数字,使它在一行中?

Kotlin 如何改变程序,通过序列中的数字来寻找一个完美的数字,使它在一行中?,kotlin,Kotlin,该计划: 按完全数,按所有数字的顺序搜索其数字 升序完全数 代码: 数字(n:Int):布尔值{ var i=1; var k=假; var m=0; 而(i你总是可以这样做: fun Int.isPerfectNumber() = (1 until this).filter { this % it == 0 }.sum() == this 5.isPerfectNumber() //or val myNumber = 6 myNumber.isPerfectNumber() 但这并不是真正

该计划: 按完全数,按所有数字的顺序搜索其数字 升序完全数

代码:

数字(n:Int):布尔值{ var i=1; var k=假; var m=0;
而(i你总是可以这样做:

fun Int.isPerfectNumber() = (1 until this).filter { this % it == 0 }.sum() == this
5.isPerfectNumber()
//or
val myNumber = 6
myNumber.isPerfectNumber()
但这并不是真正有效的。为了使它更好一些,您应该在以下情况下返回
false

  • 这个数字是奇数(没有已知的奇数完美数)
  • 数字小于6(已知的最小完美数)(或者至少检查是否为负数,因为根据定义,所有完美数都是正数)
但是,那就不是真正的一行:

fun Int.isPerfectNumber() = when {
    this < 6 -> false //smallest perfect number
    this % 2 == 1 -> false //no known odd perfect numbers
    else -> (1 until this).filter { this % it == 0 }.sum() == this 
}

你可以一直这样做:

fun Int.isPerfectNumber() = (1 until this).filter { this % it == 0 }.sum() == this
5.isPerfectNumber()
//or
val myNumber = 6
myNumber.isPerfectNumber()
但这并不是真正有效的。为了使它更好一些,您应该在以下情况下返回
false

  • 这个数字是奇数(没有已知的奇数完美数)
  • 数字小于6(已知的最小完美数)(或者至少检查是否为负数,因为根据定义,所有完美数都是正数)
但是,那就不是真正的一行:

fun Int.isPerfectNumber() = when {
    this < 6 -> false //smallest perfect number
    this % 2 == 1 -> false //no known odd perfect numbers
    else -> (1 until this).filter { this % it == 0 }.sum() == this 
}

也许值得指出的是,简洁不应该是最重要的目标。  它可能是一项有用的技能,当所有其他方面都相同时,较短的代码确实会更容易阅读、理解和修改——但所有其他方面都不相同,而且清晰、简单、健壮、灵活(在某些情况下,还有性能)gidds告诉我的老师,当他看到Kotlin及其功能时,他说尽可能地缩短代码。编写一行程序当然是一个有用的练习,并教你一些其他方法不会用到的技巧。  有时,一行程序与较长的代码一样清晰、健壮、明显和/或性能。  (在Alex T.的回答中,一行代码以比较长版本更清晰的方式解释了什么是完美数字。)  但是不要认为它自动地比一个较长的函数更好;正如我所说的,你必须在简洁性和其他目标之间取得平衡,有时一个更冗长的方法总体上更好。我完全同意你的观点,并持有相同的观点,只是在这种情况下,有一个信息是尽可能地编写代码,尽可能地表达可能值得指出我们发现简洁不应该是最重要的目标。  它可能是一项有用的技能,当所有其他方面都相同时,较短的代码确实会更容易阅读、理解和修改——但所有其他方面都不相同,而且清晰、简单、健壮、灵活(在某些情况下,还有性能)gidds告诉我的老师,当他看到Kotlin及其功能时,他说尽可能地缩短代码。编写一行程序当然是一个有用的练习,并教你一些其他方法不会用到的技巧。  有时,一行程序与较长的代码一样清晰、健壮、明显和/或性能。  (在Alex T.的回答中,一行代码以比较长版本更清晰的方式解释了什么是完美数字。)  但是,不要认为它自动优于较长的函数;正如我所说,您必须在简洁性与其他目标之间取得平衡,有时更冗长的方法总体上更好。我完全同意您的观点,并持有相同的观点,只是在这种情况下,有一条信息要求编写尽可能具有表达力的代码。谢谢您请告诉我为什么我的程序只显示前4个完美数字,然后挂起,有什么问题吗?我试图将类型更改为Long,但没有结果。我猜,因为第5个完美数字是
33.550.336
它有8位数字。这些是需要进行的大量计算。我现在正在工作,无法正确测试它我会在5-6小时后回来,如果你不需要变量和可变集合的话,它将是超级冷的!谢谢你能告诉我为什么我的程序只显示前4个完美数字,然后挂起,有什么问题吗?我试图将类型改为Long,b但是没有得到结果我猜是因为第五个完美数是
33.550.336
它有8位数字。这些都是需要进行的大量计算。我现在正在工作,所以无法正确测试它是否存在实际问题,或者它是否太慢。如果你不需要var变量和可变coll,我将在5-6小时后回来这将是超级的