में एक बाइनरी पेड़ पर पूंछ रिकर्सिव फोल्ड एक बाइनरी पेड़ के लिए एक पूंछ रिकर्सिव फोल्ड फ़ंक्शन ढूंढने की कोशिश कर रहा हूं। निम्नलिखित परिभाषा को देखते हुए:स्कैला
// From the book "Functional Programming in Scala", page 45
sealed trait Tree[+A]
case class Leaf[A](value: A) extends Tree[A]
case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
एक गैर पूंछ पुनरावर्ती क्रिया को लागू करने के लिए काफी स्पष्ट है:
def fold[A, B](t: Tree[A])(map: A => B)(red: (B, B) => B): B =
t match {
case Leaf(v) => map(v)
case Branch(l, r) =>
red(fold(l)(map)(red), fold(r)(map)(red))
}
लेकिन अब मैं एक पूंछ पुनरावर्ती गुना समारोह को खोजने के लिए इतना है कि एनोटेशन @annotation.tailrec
इस्तेमाल किया जा सकता संघर्ष कर रहा हूँ।
मेरे शोध के दौरान मुझे कई उदाहरण मिल गए हैं जहां पेड़ पर पूंछ रिकर्सिव फ़ंक्शन उदा। अपने स्वयं के ढेर का उपयोग करके सभी पत्तियों की गणना की गणना करें जो मूल रूप से List[Tree[Int]]
है। लेकिन जहां तक मैं इस मामले में समझता हूं यह केवल जोड़ों के लिए काम करता है क्योंकि यह महत्वपूर्ण नहीं है कि आप पहले ऑपरेटर के बाएं या दाएं हाथ का मूल्यांकन करें या नहीं। लेकिन एक सामान्यीकृत फोल्ड के लिए यह काफी प्रासंगिक है। यहाँ मेरी उत्कटता दिखाने के लिए कुछ उदाहरण के पेड़ हैं:
val oldNewPairs =
trees.map(t => (t, fold(t)(Leaf(_): Tree[Int])(Branch(_, _))))
और फिर सबूत समानता के शर्त यह है कि:
val leafs = Branch(Leaf(1), Leaf(2))
val left = Branch(Branch(Leaf(1), Leaf(2)), Leaf(3))
val right = Branch(Leaf(1), Branch(Leaf(2), Leaf(3)))
val bal = Branch(Branch(Leaf(1), Leaf(2)), Branch(Leaf(3), Leaf(4)))
val cmb = Branch(right, Branch(bal, Branch(leafs, left)))
val trees = List(leafs, left, right, bal, cmb)
उन पेड़ों के आधार पर मैं की तरह दिया गुना विधि के साथ एक गहरी प्रतिलिपि बनाना चाहते हैं सभी बनाई गई प्रतियों के लिए है:
val conditionHolds = oldNewPairs.forall(p => {
if (p._1 == p._2) true
else {
println(s"Original:\n${p._1}\nNew:\n${p._2}")
false
}
})
println("Condition holds: " + conditionHolds)
क्या कोई मुझे कुछ पॉइंटर्स दे सकता है, कृपया?
आप कर सकते हैं ScalaFiddle पर इस सवाल में इस्तेमाल किया कोड को खोजने: https://scalafiddle.io/sf/eSKJyp2/15
आपका कार्यक्रम ScalaFiddle में उदाहरण के लिए समाप्त नहीं करता। और मुझे 'java.lang.OutOfMemoryError: जावा हीप स्पेस' त्रुटि मिलती है जब मैं इसे 'पत्ते' के लिए अम्मोनिट में चलाने की कोशिश करता हूं। – adamwy
@adamwy आप सही हैं, 'शाखा' मामले में एक टाइपो त्रुटि थी जिसके लिए ढेर का उपभोग नहीं किया जा रहा था। मैंने जवाब –
संपादित किया है अब मैं इसे स्कैलाफ़िल में प्राप्त करता हूं: 'मूल: शाखा (पत्ता (1), शाखा (पत्ता (2), पत्ता (3))) नई: शाखा (शाखा (पत्ता (1), पत्ता (2)), पत्ता (3)) हालत रखती है: झूठी ' – adamwy