この関数は、リスト内のすべての数値の合計を返す必要がありますが、実行すると常に返され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
}
それの何が問題なのですか?
この関数は、リスト内のすべての数値の合計を返す必要がありますが、実行すると常に返され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
}
それの何が問題なのですか?
リストの先頭を に追加する必要がありますans
。現時点では、再帰していますが、実際にはリストの先頭を使用していません。
たとえば、リストの先頭を残りの合計に追加する、以下のようなものが必要だと思います。
scala> def sum(st: List[Int]): Int =
| {
| if (st.isEmpty) {
| 0
| }
| else {
| st.head + sum(st.tail)
| }
| }
sum: (st: List[Int])Int
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$
combine
method内でメソッドを定義しましたsum
が、呼び出していませんcombine
( 内以外でcombine
は呼び出されません)。メソッドを呼び出さないと、実行されません。メソッドを定義するだけでは、それが実行されるわけではありません。
関数型スタイルでプログラミングしたい場合は、可変変数 ( var
) の使用も避ける必要があります。val
代わりに不変値 ( ) を使用してください。
また、combine
メソッドは何も合計していません (ans
どこも変更していないか、リスト内の値を使用していません)。
あなたのソリューションが機能しない理由について、ブライアンの回答に同意します。
さらに、Scala の Sequence の API ( List が実装する) を使用して、 foldLeft を使用して、さらに短い方法でそれを行う方法があります。
def sum(st: List[Int]): Int = {
st.foldLeft(0)(_ + _)
}
hedefalk が述べたように、foldLeft、さらには sum が好ましいオプションです。