どのようにして、以下の関数を通常の再帰とテール再帰で書くことができますか?スカラ再帰
スカラ再帰
答えて
ここには基本的な再帰バージョンがあります。
def satisfiesAllIt(x: List[Any], test: Any => Boolean): Boolean =
if (x.isEmpty) true
else if(test(x.head)) satisfiesAllIt(x.tail, test) && true
else false
ここでは尾部再帰バージョンがあります。
def satisfiesAllIt(x: List[Any], test: Any => Boolean): Boolean =
if (x.isEmpty) true
else if(test(x.head)) satisfiesAllIt(x.tail, test)
else false
これは、標準ライブラリを学習した後の作業です。
def satisfiesAllIt(x: List[_], test: Any => Boolean): Boolean = x.forall(test)
@The典型ポールは(彼はしばしばように)良い点を作り、代替手段を提供してきました。
// basic recursive
def satisfiesAllA(x: List[Any], test: Any => Boolean): Boolean =
x.isEmpty || satisfiesAllA(x.tail, test) && test(x.head)
// tail recursive
def satisfiesAllB(x: List[Any], test: Any => Boolean): Boolean =
x.isEmpty || test(x.head) && satisfiesAllB(x.tail, test)
は、我々はすべて実際にそれを指摘せずに、周りに踊っているのか、基本と尾再帰間の定義の違いは次のとおりです。再帰呼び出しが戻る(計算/評価後に行われる任意のより多くの「仕事」があるかどう/ etc。)
ではなく、テール再帰的です。
' && true''を非末尾再帰にするのはちょっとハックです:)もし、非末尾再帰的なものを使いたいのであれば、OPの関数をエミュレートしてカウントするのが良いでしょうか? –
@TheArchetypalPaul、私は同意しない。コアの違いをよりよく説明できるように、2つのバージョンをできるだけ似ている方が有益であると感じました。 – jwvh
私はそれが違いを説明しないと思います。 "&& ttrue"はアルゴリズム上の理由ではありません '= x、isEmpty || (satisfiesAll(x.tail、test)&& test(x.head)) 'は、簡潔で非末尾再帰的なものですか? –
satisfiesAllIt
の末尾再帰バージョンです。リストが終了するまで関数を再帰的に呼び出し、テストが失敗した場合はfalse
を返します。
def satisfiesAllIt(x: List[Any], test: Any => Boolean): Boolean = xs match {
case Nil => true
case x :: xs =>
if (test(x)) satisfiesAllIt(xs, test) else false
}
あなたはそれらを数える必要はありません。あなたはちょうど最初のものが満足していないときに停止する必要があります –
@TheArchetypalPaulあなたは正しいです。それを修正しました:) – pamu
あなたが 'helper'に' test'を渡すと、ヘルパー関数は必要ありませんしかし、ただ 'satisfiesAllIt'を持つことができます:) –
- 1. スカラの再帰リスト操作
- 2. テール再帰 - スカラ(その他の言語)
- 3. スカラのテール再帰的なfindNextAndTail
- 4. スカラ:再帰的価値listHumanのニーズが
- 5. スカラ:リストの再帰的集計
- 6. スカラ:再帰を使用してリストアイテムの値をカウントする
- 7. スカラでタプルから再帰オブジェクトグラフを作成
- 8. Scalaの本からのスカラ再帰の説明
- 9. SMLの相互再帰関数を解析するスカラ
- 10. 再帰的に定義された型のスカラと==メソッド
- 11. スカラ再帰関数が返るいずれか
- 12. 複数のリストにわたるスカラ再帰
- 13. スカラのネストされたリストを再帰的に処理する
- 14. スカラ - 再帰的メソッドは異なる値を返します
- 15. スカラで再帰的に平方根を計算する
- 16. スカラ:金利計算のための再帰の使用
- 17. スカラ再帰関数の戻り値の型が
- 18. スカラ座のn-アリティツリー末尾再帰評価
- 19. テール再帰(@tailrec)再帰関数対非再帰関数スカラースタックオーバーフローエラー?
- 20. スカラでテール再帰を使用してリスト内の整数を見つける
- 21. このテール再帰的なスカラ関数に注釈を付ける方法
- 22. スカラの初期入力が再帰関数で認識されない
- 23. スカラ:ツリー複雑な構造のテール再帰を挿入します
- 24. 変換するループ...再帰の再帰
- 25. 再帰、テール再帰と反復
- 26. JSON/BigInt Jsonデシリアライザ(再生/スカラ)
- 27. 再帰
- 28. 再帰
- 29. 再帰
- 30. 再帰
あなた自身で試しましたか?はいの場合..どこにいらっしゃいますか? – pamu
大きな質問です。 – Det