2017-05-21 53 views
1

對於一些數學樂趣問題,我使用數字向量作爲整數的表示。這對我來說工作得很好。現在我想將矢量轉換回整數。我沒有找到合適的出的現成東西,並用下面的函數上來:如何將數字的矢量轉換爲整數?

(defun vector->integer (vec) 
    "Returns a given vector of digits as an integer." 
    (loop :for digit :across vec 
     :with number-string = "" 
     :do (setf number-string 
      (concatenate 'string number-string (write-to-string digit))) 
     :finally (return (parse-integer number-string)))) 

,它基本上是我想要的,但我發現轉換vectorstringinteger有點麻煩。有什麼更有效率嗎?

+0

這個問題是關於代碼的效率,你應該張貼在[codereview.stackexchange .COM](https://codereview.stackexchange.com/)。 – Renzo

+0

由於@TeMPOral已經回答了我的問題,我不會在_codereview_上再次提問,但會在下次考慮。 –

回答

4

爲什麼不使用乘法而不是連接字符串?

E.g.

(loop for digit across vec 
     with number = 0 
     do (setf number (+ (* 10 number) digit)) 
     finally (return number)) 

或者更簡單:

(reduce (lambda (a b) (+ (* 10 a) b)) vec) 
3

你的代碼更簡單,更有效地寫爲:

(defun vector->integer (vector) 
    (parse-integer (map 'string #'digit-char vector))) 
+0

這確實是非常簡潔的編碼,但也需要從'矢量'到'字符串'到'整數'的轉換。這不是沒有效率嗎? –

+1

@MartinBuchmann:一個字符串和一個整數。您的代碼創建串聯一個字符串與單個字符串的字符串。它也在LOOP中這樣做。這是低效的。假設矢量有100個數字。您的代碼將創建長度分別爲0,1,2,3,4,... 98,99,100的字符串。只保留最後一個。所有其他人都是垃圾。我的代碼只創建了一個與輸入向量長度相同的字符串,因爲MAP的實現是一半體面的。 –

+1

@MartinBuchman:如果你在一個循環中連接了一個列表或一個向量的末尾,那麼很容易發現這將是低效的。通常將循環中的向量連接起來效率不高。通常可以用相對簡單的方式編寫更高效的代碼。編寫更高效的代碼通常也是可能的,但是代碼可能看起來更復雜。 –