2017-03-15 105 views
0

我目前正在clojure工作的路線規劃程序。我使用ubergraph創建我的數據結構,然後使用構建在最短路徑算法中的ubergraph。我有它的工作與傳遞2個參數,也有它的工作與傳遞3個參數。使用ubergraph的最短路徑clojure的遞歸函數

但是,而不是寫一個新的函數每次我想傳遞更多的參數是有辦法寫一個遞歸版本,可以採取任何數量的參數?

(defn journey [start end] 
    (alg/pprint-path (alg/shortest-path all-edges {:start-node start, :end-node end, :cost-attr :weight}))) 



(journey :main-office :r131) 

(defn fullpath [start delivery end] 
    (journey start delivery) 
    (journey delivery end)) 


(fullpath :main-office :r131 :main-office) 
(fullpath :main-office :r119 :main-office) 

上面是我目前有代碼工作正常的代碼。

是否有可能編寫一個函數來接受下面的參數,例如仍然打印出所採用的路徑。

(fullpath :main-office :r113 :r115 :main-office) 

任何幫助極大的讚賞。

+0

你檢查此[頁碼](HTTP:/ /stackoverflow.com/questions/9242440/how-to-make-a-clojure-function-take-a-variable-number-of-parameters)?你嘗試過「應用」嗎? – jmargolisvt

+0

嗨,如果我對ap​​ply的理解是正確的,在這種情況下不起作用?我試圖編寫一個遞歸函數來計劃通過所有傳入的變量(在我的案例中歸類爲房間)的路線。所以當2個參數傳入時,它計劃從一個 - > b的路由,但是我想要它,所以如果我傳遞3個變量,它計劃一個 - > b然後b - > c等。 – benjano

+0

定義一個函數[ args]會將傳遞給函數的所有參數綁定到參數args –

回答

1

下應該工作

(defn fullpath [& stops] 
    (map (fn [a b] (journey a b)) stops (rest stops)) 

這對於

(fullpath :a :b :c ..) 

收集的

(journey :a :b) 
(journey :b :c) 
... 

結果到一個集合。由於旅途的您的返回值似乎是零,你只有在打印出來的副作用有興趣,你可能要放在一個DOALL,即

(defn fullpath [& stops] 
    (doall (map (fn [a b] (journey a b)) stops (rest stops))) 
+0

嗨,歡呼的答案。完美的作品 – benjano