質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

1196閲覧

ScalaでList[(Long, Long)]を再帰関数で得る方法について教えてください。

nateriver111208

総合スコア1

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/11/20 09:12

前提・実現したいこと

Scalaで引数のペアをもつリストを戻り値とする再帰関数を書いています。例えば引数が1000だった場合、(1000,1000),(999,999),(998,998),(997,997),...が戻り値になります。

発生している問題・エラーメッセージ

本来はList[(Long, Long)]を戻して欲しいのですが、おそらく条件を満たさなかった場合にList[Unit]を戻してしまっています。

エラーメッセージ
On line 4: error: type mismatch;
found : Unit
required: (Long, Long)

該当のソースコード

Scala 2.13.3
ソースコード
def recursion(n: Long) : List[(Long, Long)] = {
if(n == 1) List((n, n))
else if(n > 1) List((n, n)) ++ recursion(n - 1)
else List(())
}

試したこと

何を直せばいいのか全くわからず混乱している状況です。試しに戻り値をList[Long]にしてみたらそのときは正常に動きました。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

エラー文の通りですが、4行目の「List(())」の型が期待したものと異なります
「List[(Long, Long)]」を期待しているのに「List[Unit]」になってしまっていますね

「()」の型が何になるか確認し、
それの代わりに「(Long, Long)」の型に相当するオブジェクトを当てはめるのがよさそうに見えます。
(他にも気になる部分はありますが、今回の問題は解消されるかと思われます)

補足

今回の質問と脱線してしまいますが、
IDEを使って試してみると理解や解析がすすみやすいかなと思います。

(Scala に限りませんが)型が一致するか、文法がただしいかを確認するのは結構な高コストですが、
IDEなどの開発ツールでその部分を強く補助してくれるので、使った方が実装自体だけでなく、理解も深まるかと思います。
個人的には Intellij IDEA がおススメです。

今回のケースですと、以下のように型のアンマッチをグラフィカルに表示してくれます(画像は IntelliJ IDEA Community版)。
イメージ説明

投稿2020/11/21 06:55

kiino

総合スコア557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nateriver111208

2020/11/30 13:37

丁寧な回答ありがとうございます!
kiino

2020/12/05 09:54

コメントありがとうございます。 解決しましたでしょうか? 解決済みにしていただけると嬉しいです。
guest

0

エラーメッセージを読んでください。答えが書いてあります。
それ何かの課題ですよね?
ただ答えを教えてもらうのではなく、理解できるところまで戻って復習したほうが良いと思いますよ。

投稿2020/11/20 11:32

rysh

総合スコア874

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問