1

この関数は、リスト内のすべての数値の合計を返す必要がありますが、実行すると常に返されans=0ます。

def sum(st: List[Int]): Int = {
  var ans=0 

  def combine(st: List[Int], ans:Int): Int = {
    if (st.isEmpty) ans else combine(st.tail, ans)        
  }
  ans
}

それの何が問題なのですか?

4

5 に答える 5

5

リストの先頭を に追加する必要がありますans。現時点では、再帰していますが、実際にはリストの先頭を使用していません。

たとえば、リストの先頭を残りの合計に追加する、以下のようなものが必要だと思います。

scala> def sum(st: List[Int]): Int = 
     | {
     | if (st.isEmpty) {
     |    0
     | }
     | else {
     |    st.head + sum(st.tail)
     | }
     | }
sum: (st: List[Int])Int
于 2013-03-26T14:13:53.190 に答える
3

1)内部メソッドの結合を呼び出していません-0に初期化されているため、ansを返すだけです。

2) 結合は実際には何もしません

あなたが書きたかったコードは次のとおりだと思います。

def sum(st: List[Int]): Int = {
  def combine(st: List[Int], ans:Int): Int = {
    if (st.isEmpty) ans else combine(st.tail, ans + st.head)        
  }
  combine(st, 0)
}

もちろん、短いバージョンは次のようになります。

st.foldLeft(0)(_ + _)

あるいは単に

st.sum

これは Numeric の標準型クラス インスタンスを使用します: IntIsIntegral:

http://www.scala-lang.org/api/current/index.html#scala.math.Numeric $$IntIsIntegral$

于 2013-03-26T15:34:06.953 に答える
2

combinemethod内でメソッドを定義しましたsumが、呼び出していませんcombine( 内以外でcombineは呼び出されません)。メソッドを呼び出さないと、実行されません。メソッドを定義するだけでは、それが実行されるわけではありません。

関数型スタイルでプログラミングしたい場合は、可変変数 ( var) の使用も避ける必要があります。val代わりに不変値 ( ) を使用してください。

また、combineメソッドは何も合計していません (ansどこも変更していないか、リスト内の値を使用していません)。

于 2013-03-26T14:51:08.683 に答える
1

あなたのソリューションが機能しない理由について、ブライアンの回答に同意します。

さらに、Scala の Sequence の API ( List が実装する) を使用して、 foldLeft を使用して、さらに短い方法でそれを行う方法があります。

def sum(st: List[Int]): Int = {
    st.foldLeft(0)(_ + _)
}
于 2013-03-26T14:52:12.137 に答える
0

hedefalk が述べたように、foldLeft、さらには sum が好ましいオプションです。

于 2013-03-26T17:11:19.893 に答える