计算出从1到100之间所有奇数的平方之和,scala

最近开始学scala语言,现在手里有本programming in scala 的中文和英文电子书,但是中文不全(1~13 )算是入门吧,全英文的,看了几眼就晕头转向的了。求大神们翻译下半部吧。

昨天加了两个scala 的QQ群,今天看到一个加群做题的须知,代码作为入群密码。

题目:计算出从1到100之间所有奇数的平方之和

提示:即1*1 + 3*3 +5*5 + ... + 99*99,结果为166650

要求scala代码的长度不超过50个字符,代码越简洁易读越好。

兴趣一来,写了两个实现,但结果均超出50个字符,希望有人返馈更简洁的方法。

package com.scala.exmple

object Odd {
 
  //Java习惯for循环实现100以内奇数的平方相加求和
//  def s(x: Int)=x * x
//  private var c = 0
//  def sum(n: Int):Int ={
//       for(i <- 1 to n)
//         if(i % 2 != 0)
//          c += s(i)
//       c
//  }
 
  //for循环实现100以内奇数的平方相加求和
  def s(x: Int)=x * x
  private var c = 0
  def oldOddSum(n: Int): Int={
       for(i <- 1 to n;if(i % 2 != 0))
         yield  c += s(i)
       c}
 
  //递归实现100以内奇数的平方相加求和
  def oddSum(x: Int): Int =
    if(x == 1) 1
    else if (x % 2 == 0) oddSum(x - 1)
    else x * x + oddSum(x - 1)
     
  def main(args: Array[String]): Unit = {}
   
  println(oldOddSum(100))
  println(oddSum(100))
     
}

---------------------------------------<<续

这是群里高手给出的,只用了34个字符
 println((1 to 99 by 2).map(x => x * x).sum)
但我修改了下,更容易理解,但是用了50个字符,算是达标了。
  val odd100=(for(i<-1 to 100;if(i%2!=0))yield i*i).map(+_).sum
   println(odd100)
   println("(for(i<-1 to 100;if(i%2!=0))yield i*i).map(+_).sum".length)

 


### 使用Scala编写程序计算1100的数字之和Scala中,可以利用函数式编程特性以及内置方法轻松实现和操作。下面展示了一种简洁的方式完成此任务: ```scala object SumNumbers { def main(args: Array[String]): Unit = { val sum = (1 to 100).sum println(s"The sum of numbers from 1 to 100 is $sum") } } ``` 上述代码定义了一个名为`SumNumbers`的对象,并在其内部实现了`main`方法,在该方法内通过`(1 to 100)`创建了从1100(含)的一个范围对象[^1]。接着调用了`.sum`方法对该范围内所有整数进行了累加运算并打印最终结果。 另一种方式则是采用循环结构来进行迭代相加: ```scala object SumLoop { def main(args: Array[String]): Unit = { var total = 0 for(i <- 1 until 101){ total += i } println(s"The sum using loop is $total") } } ``` 这里展示了使用for表达式的例子,其中`until(101)`表示不包含上限值101;而每次迭代都将当前索引变量i加入到累积器`total`之中直至遍历结束。 #### 更高效的解决方案——高阶函数reduceLeft 还可以借助于集合上的高阶函数来简化逻辑: ```scala object ReduceExample { def main(args: Array[String]): Unit = { val result = (1 to 100).toList.reduceLeft(_ + _) println(f"Using reduceLeft, the sum is ${result}") } } ``` 这段代码同样完成了相同的功能但是采用了不同的思路:先将Range转换成List再应用`reduceLeft`操作符依次两两相加以获得总和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值