में एक int को उलटाना मैं खुद को ओकैमल पढ़ रहा हूं, और अभ्यास के लिए उपयोग किए जाने वाले मुख्य संसाधन कुछ समस्याएं हैं जो कॉर्नेल ने 3110 वर्ग से उपलब्ध कराई है। समस्याओं में से एक एक int को उल्टा करने के लिए एक फ़ंक्शन लिखना है (यानी: 1234 -> 4321, -1234 -> -4321, 2 -> 2, -10 -> -1 आदि)।OCaml
मैं एक काम कर समाधान है, लेकिन मैं चिंतित हैं कि यह वास्तव में मुहावरेदार OCaml नहीं है कर रहा हूँ:
let rev_int (i : int) : int =
let rec power cnt value =
if value/10 = 0 then cnt
else power (10 * cnt) (value/10) in
let rec aux pow temp value =
if value <> 0 then aux (pow/10) (temp + (value mod 10 * pow)) (value/10)
else temp in
aux (power 1 i) 0 i
यह जहाँ तक मैं बता सकता है सभी मामलों में ठीक से काम करता है, लेकिन यह सिर्फ गंभीरता से लगता है " un-oCaml "मेरे लिए, विशेष रूप से क्योंकि मैं दो आंतरिक-कार्यों के साथ दो बार int की लंबाई के माध्यम से चल रहा हूँ। तो मैं बस सोच रहा हूं कि ऐसा करने के लिए एक और "ओकैमल" तरीका है या नहीं।
let decompose_int i =
let r = i/10 in
i - (r * 10) , r
इस समारोह मुझे पूर्णांक विघटित रूप में अगर मैं एक सूची थी अनुमति देता है:
क्यों नहीं - स्ट्रिंग -> चार सरणी -> चार सरणी उलट>> स्ट्रिंग -> उलटा उलट? यह ओकैमल नहीं है लेकिन मैंने https://en.wikipedia.org/wiki/Lychrel_number के साथ खेलते समय एसएमएल/एनजे (इंपोड और विस्फोट का उपयोग करके ओकैम की कमी महसूस कर रहा है) में समान चीजें की हैं। सरल परिवर्तनों को एक साथ जोड़ना कार्यात्मक प्रोग्रामिंग में काफी मूर्खतापूर्ण है। इसमें डेटा पर एकाधिक पास लग सकते हैं, लेकिन भाषा सीखते समय "समयपूर्व अनुकूलन से बचें" अच्छी सलाह है। –
मुझे आपके समाधान के बारे में कुछ भी अनियमित नहीं दिख रहा है। शायद कुछ और चालाक समाधान हैं, लेकिन यह एक अलग सवाल है। –