我已經解決了4clojure.com中的45個問題,我注意到我試圖用遞歸和累加器來解決一些問題的方式中出現了一個反覆出現的問題。累加器,連接詞和遞歸
我會盡力解釋我所做的最好的事情,最終得到一些富有希望的解決方案,希望一些Clojurers能夠「得到」我沒有得到的東西。
例如,問題34要求編寫一個函數(不使用範圍)以兩個整數作爲參數並創建一個範圍(不使用範圍)。簡單地說,你做(... 1 7),你得到(1 2 3 4 5 6)。
現在這個問題不是解決這個問題。
如果我想要使用遞歸和累加器來解決這個問題呢?
我的思維過程是這樣的:
我需要編寫一個函數取兩個參數,我開始(FN [XY])
我需要遞歸我需要跟蹤一個列表,我將使用一個累加器,所以我在第一個函數內寫入第二個函數,並採取額外的參數:
(fn [xy]
((FN克[XY ACC] ...) X Ý 「())
(顯然我不能正確地格式化的Clojure代碼上SO!?)
在這裏,我已經不知道我做的是否正確:第一個功能必須需要兩個整數參數(不是我的調用),我不確定:如果我想使用累加器,可以使用累加器沒有創建嵌套函數?
然後我想連詞,但我不能這樣做:
(conj 0 1)
所以我做奇怪的事情,以確保我有一個序列第一,我結束了這一點:
(fn
[x y]
((fn g [x y acc] (if (= x y) y (conj (conj acc (g (inc x) y acc)) x)))
x
y
'()))
但後來這產生這樣:
(1 (2 (3 4)))
取而代之的是:
(1 2 3 4)
所以我最終會做一個額外的拉平和它的作品,但它是完全醜陋。
我開始明白了一些事情,甚至在某些情況下,我開始以更多clojuresque的方式「思考」,但我在編寫解決方案時遇到了問題。
例如這裏我決定:
- 使用的蓄能器
- 到通過遞增X,直到它到達ý
但我結束與怪物上述遞歸。
有一個很多的方式來解決這個問題,再次,這不是我所追求的。
什麼我之後是怎麼回事,之後我決定利弊/連詞,使用蓄能器,以及遞歸,我可以這樣結束了(不是我寫的):
#(loop [i %1
acc nil]
(if (<= %2 i)
(reverse acc)
(recur (inc i) (cons i acc))))
的這個代替:
((fn
f
[x y]
(flatten
((fn
g
[x y acc]
(if (= x y) acc (conj (conj acc (g (inc x) y acc)) x)))
x
y
'())))
1
4)
我把它是一個開始,以便能夠解決一些問題,但我是一個有點醜陋的解決方案,我往往會產生失望......
不要害怕扔掉不好的解決方案。如果您開始看到您的代碼變得笨重,請退後一步並考慮一下。當它不*感覺*正確時,它可能不是。 – Jeremy
@JeremyHeiler:好的,但「主意」並不壞,這是「實現」/實際代碼是不好的。例如,使用和累加器+遞歸的簡短解決方案是由解決了150個問題的人寫的(其中一些實際上並不重要)。所以我的想法似乎並不糟糕,但我還不能幹淨地實施我的想法。我認爲拼圖碎片需要一些時間才能到位: -/ –
當然可以。只要繼續練習和玩代碼! – Jeremy