Chuyển đến nội dung
Diễn đàn CADViet
ketxu

[Hỏi]Đố vui với LISP

Các bài được khuyến nghị

(defun check (lst / rt)
(setq rt (if (vl-some '(lambda(x y)(/=(length x)(length y)))  lst (cdr lst)) 0 1))
)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thanks all.

 

Đáp án của nPham la

 

(defun check (lst)

(if (apply '= (mapcar 'length lst)) 1 0)

)

 

Một câu khác các bác nhé, anh em mình lấy lisp làm niềm vui mà. hehe.

 

Hãy đảo list '((1 2 3 4)(a b c d)(5 6 7 8))

thành:

 

'((1 a 5)(2 b 6) (3 c 7)(4 d 8))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thanks all.

Đáp án của nPham la

Một câu khác các bác nhé, anh em mình lấy lisp làm niềm vui mà. hehe.

 

Hãy đảo list '((1 2 3 4)(a b c d)(5 6 7 8))

thành:

 

'((1 a 5)(2 b 6) (3 c 7)(4 d 8))

 

Cách của npham ngắn hơn nhưng khi thực thi thì các bước đi cũng tương tự như bác ĐVH, tức là luôn quét qua 1 lượt list :) tương đương với vl-every :)

Ở 2 lisp của bác ĐVH thì cần thiết thay đổi repeat thành while, khi nào phát hiện kết quả là 0 thì dừng ngay. Khi đó cả hàm sẽ tương đương với vl-some.

Cái đảo list của npham :

(defun Transpose(lst)(apply 'mapcar (cons 'list lst)))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ở 2 lisp của bác ĐVH thì cần thiết thay đổi repeat thành while, khi nào phát hiện kết quả là 0 thì dừng ngay. Khi đó cả hàm sẽ tương đương với vl-some.

Ket có thể giải thích vì sao nên đổi repeat thành while ?

dùng repeat có lợi gì? hại gì?

dùng while có lợi gì? hại gì?

Thanks!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ket có thể giải thích vì sao nên đổi repeat thành while ?

dùng repeat có lợi gì? hại gì?

dùng while có lợi gì? hại gì?

Thanks!

Trong trường hợp này Ket đúng. Repeat có số vòng lặp xác định nên nó lặp đến hết chiều dài của lst, while có số vòng lặp không xác định nên nó sẽ lặp hoặc vô tận hoặc sẽ dừng khi điều kiện cung cấp cho while không thoả mãn. Bài toán y/c kiểm tra để trả về 1 hoặc 0, do đó ta đặt thêm điều kiện cho while là khi trả về 0 thì dừng lặp. Điều này rất lợi hại khi số lần lặp đủ lớn. Ví dụ trong lst của bài toán: có 1000 sublst nhưng nếu 2 sublst đầu có chiều dài khác nhau thì dùng while nó sẽ lặp chỉ 1 lần rồi dừng, nhưng dùng repeat nó sẽ lặp 999 lần!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cách của npham ngắn hơn nhưng khi thực thi thì các bước đi cũng tương tự như bác ĐVH, tức là luôn quét qua 1 lượt list :) tương đương với vl-every :) Ở 2 lisp của bác ĐVH thì cần thiết thay đổi repeat thành while, khi nào phát hiện kết quả là 0 thì dừng ngay. Khi đó cả hàm sẽ tương đương với vl-some. Cái đảo list của npham :
 (defun Transpose(lst)(apply 'mapcar (cons 'list lst))) 

 

Trời !!! Sao hay vậy ta. Két chỉ giáo thêm về cái giải thuật này đuwocj không, lạ quá, đọc hoài không hiểu :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thanks all.

 

Đáp án của nPham la

 

 

 

Một câu khác các bác nhé, anh em mình lấy lisp làm niềm vui mà. hehe.

 

Hãy đảo list '((1 2 3 4)(a b c d)(5 6 7 8))

thành:

 

'((1 a 5)(2 b 6) (3 c 7)(4 d 8))

Hơi dài, nhưng xài được. Cách của Ket độc quá nên chả hiểu nổi!

(defun HA3(ds / ds1 ds2 ds3 n m x y)
(setq n (length ds) m (length (setq ds1 (reverse (apply 'append ds)))) x 0)
(repeat (/ m n)
 (setq y 0 ds2 nil)
 (repeat n
  (setq ds2 (cons (nth (+ x y) ds1) ds2))
  (setq y (+ (/ m n) y)))
 (setq x (1+ x))
 (setq ds3 (cons ds2 ds3)))
ds3)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ket chơi độc quá. còn đây Cách của nPham nè.

 

(defun vlp-list-trans (s / data subdata i x)

(setq i 0)

(setq data (append))

(repeat (length (car s))

(setq subdata (append))

(foreach x s (setq subdata (append subdata (list (nth i x)))))

(setq data (append data (list subdata)))

(setq i (1+ i))

)

data

)

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ket chơi độc quá. còn đây Cách của nPham nè.

Hề hề hề,

Cái độc của Ketxu là không chỉ ở đây đâu. Việc hiểu cặn kẽ các hàm và áp dụng kết hợp chúng với nhau là một biệt tài của ketxu. Thông thường người học mót như mình thjì chỉ ráng hiểu từng hàm riêng biệt và sử dụng nó theo cái cách độc lập mà tốt thì đã là một hạnh phúc rùi. Còn với Ketxu thì chưa đủ, phải là làm sao để kết hợp chúng một cách nhuần nhuyễn nhất và càng nhiều hàm lồng nhau càng ....... khoái. Khoái không chỉ vì nó gọn đẹp mà còn là khoái vì hiểu chúng rõ hơn...

Hề hề hề, bái phục, bái bái phục.

Cái cỡ đi mót như mình thì chắc đến khi sang tiểu vẫn chửa hiểu được hết cái thâm nho của.... lispKet.

Hề hề hề,....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trong trường hợp này Ket đúng. Repeat có số vòng lặp xác định nên nó lặp đến hết chiều dài của lst, while có số vòng lặp không xác định nên nó sẽ lặp hoặc vô tận hoặc sẽ dừng khi điều kiện cung cấp cho while không thoả mãn. Bài toán y/c kiểm tra để trả về 1 hoặc 0, do đó ta đặt thêm điều kiện cho while là khi trả về 0 thì dừng lặp. Điều này rất lợi hại khi số lần lặp đủ lớn. Ví dụ trong lst của bài toán: có 1000 sublst nhưng nếu 2 sublst đầu có chiều dài khác nhau thì dùng while nó sẽ lặp chỉ 1 lần rồi dừng, nhưng dùng repeat nó sẽ lặp 999 lần!

Cái lợi của while bạn DOAN VAN HA đã nói đúng nhưng với bài toán đề ra thì dùng repeat đúng hơn vì nhanh hơn đó là lý do vì sao repeat vẫn tồn tại song song với while.

phần code của bạn nếu thêm (exit) khi ok =0 thì sao?

theo lý thuyết là thế nhưng chưa test với lisp. bạn nào đã test thì cho xin cái đáp án.

Thanks!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cái lợi của while bạn DOAN VAN HA đã nói đúng nhưng với bài toán đề ra thì dùng repeat đúng hơn vì nhanh hơn đó là lý do vì sao repeat vẫn tồn tại song song với while.

phần code của bạn nếu thêm (exit) khi ok =0 thì sao?

theo lý thuyết là thế nhưng chưa test với lisp. bạn nào đã test thì cho xin cái đáp án.

Thanks!

1). Có trường hợp không thể dùng while được nên nó mới tồn tại // 2 thằng (hay chính xác là dùng while không tiện bằng repeat).

2). Trong bài toán: nếu thêm exit khi ok với repeat thì nó lỗi ngay, còn khi thêm đ/k (while (or (...) (/= ok 0)) thì nó dừng lại êm đềm khi ok=0.

3). Dùng while nhanh hơn repeat ở bài toán tổng quát chứ (lặp 1 vòng và lặp 999 vòng mà).

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cái lợi của while bạn DOAN VAN HA đã nói đúng nhưng với bài toán đề ra thì dùng repeat đúng hơn vì nhanh hơn đó là lý do vì sao repeat vẫn tồn tại song song với while.

phần code của bạn nếu thêm (exit) khi ok =0 thì sao?

theo lý thuyết là thế nhưng chưa test với lisp. bạn nào đã test thì cho xin cái đáp án.

Thanks!

theo lý thuyết là thế nhưng ...

Có thể tôi chưa biết hết các hàm Lisp nhưng LISP không có hàm cho phép exit trong vòng lặp Repeat.

Hàm Exit hay Quit của Lisp thoát luôn khỏi ứng dụng.

(Các ngôn ngữ khác thì có vd : Break, Continue, Goto, Exit ... để thoát khỏi vòng lặp)

(defun c:test()
 (setq i 0)
 (repeat 5
   (setq i (1+ i))
   ;(if (= i 2) (exit)) ;(quit))
   )
 (princ i) (princ ))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Muốn thoát khoải vòng lặp rẻpeat thì dùng mẹo thôi

 

(defun c:test()

(setq i 0)

(repeat 5

(setq i (1+ i))

(if (= i 2)(setq i 5))

)

(princ i)

(princ )

)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Trời !!! Sao hay vậy ta. Két chỉ giáo thêm về cái giải thuật này đuwocj không, lạ quá, đọc hoài không hiểu biggrin.png

Hề hề hề,

Sau khi gặm cái món "độc hơn thịt chuột" này của bác ketxu, với cái trình độ học mót của mình thì vỡ ra được mấy thứ như sau, đúng sai mong các bác tận tình chỉ dạy thêm hè:

1/- Cái hàm (cons 'list lst) của Ketxu trả về một list là (LIST (1 2 3 4) (A B C D) (5 6 7 8))

2/- Vậy nên khi dùng hàm (apply 'mapcar (cons 'list lst)) nghĩa là áp dụng cái hàm mapcar cho cái list (LIST (1 2 3 4) (A B C D) (5 6 7 8))

Vấn đề độc ở dây chính là cái cách dùng thằng mapcar này vì theo cú pháp thì hàm mapcar phải sử dụng một function cho các list đi kèm nhưng ở đây chả thấy cái function nào cả.

Hề hề hề,

Nếu dùng (mapcar 'list '(1 2 3 4) '(a b c d) '(5 6 7 8)) tức là sử sụng hàm list cho các danh sách '(1 2 3 4), '(a b c d), '(5 6 7 8) thì nó sẽ trả về cái list mà bác Npham mong muốn.

Từ đó mình luận theo kiểu củ chuối rằng khi áp dụng cái hàm mapcar với cái list (LIST (1 2 3 4) (A B C D) (5 6 7 8)) có nghĩa rằng sẽ áp dụng cái hàm list với các danh sách '(1 2 3 4), '(a b c d), '(5 6 7 8) như đã nói ở trên.

 

Để thẩm định lại cái hiểu của mình, mình đã thay '(a b c d) bằng '(2 3 4 5) và dùng hàm + thay cho hàm list thì thấy kết quả như sau:

(mapcar '+ '(1 2 3 4) '(2 3 4 5) '(5 6 7 8)) trả về list (8 11 14 17)

(apply 'mapcar (cons '+ (list '(1 2 3 4) '(2 3 4 5) '(5 6 7 8)))) củng trả về list (8 11 14 17)

Từ đó mình rút ra cái kết luận tù mù rằng: cái độc của bác ketxu ở đây chính là nhét cái function của hàm mapcar vào bên trong cái list của hàm apply nhờ hàm cons.

 

Độc thiệt , độc thiệt, chả biết món thuốc mình vừa tìm có giải được cái độc đó không hè?????

Kính mong các bác rộng ..... miệng chỉ bảo thêm.

Hề hề hề,....

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Muốn thoát khoải vòng lặp rẻpeat thì dùng mẹo thôi

 

(defun c:test()

(setq i 0)

(repeat 5

(setq i (1+ i))

(if (= i 2)(setq i 5))

)

(princ i)

(princ )

)

Hề hề hề,

Mặc kệ cái mẹo của bác nhưng đã dùng repeat thì nó cứ phải lặp đủ 5 phát bác ạ. Không tín bác thử xem nhé. Sau khi test cái thằng i của bác nó là 8 chứ có dừng ở 5 đâu ạ.

Hề hề hề,....

Giá mà bác dùng while thì ắt nó sẽ dừng đúng chỗ bác cấn.....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

nhét cái function của hàm mapcar vào bên trong cái list của hàm apply nhờ hàm cons.

Bác Bình quả thật tinh ý ^^

Apply 'function '('a 'b 'c ..) => (function 'a 'b 'c ..)

Function ở đây là mapcar, phần tử đầu là 'list (mà ta append vào nhờ cons), ta lại được :

(mapcar 'list 'c 'b ..) => ra kết quả như bác đã phân tích :

Nếu dùng (mapcar 'list '(1 2 3 4) '(a b c d) '(5 6 7 8)) tức là sử sụng hàm list cho các danh sách '(1 2 3 4), '(a b c d), '(5 6 7 8) thì nó sẽ trả về cái list mà bác Npham mong muốn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

theo lý thuyết là thế nhưng ...

Có thể tôi chưa biết hết các hàm Lisp nhưng LISP không có hàm cho phép exit trong vòng lặp Repeat.

Hàm Exit hay Quit của Lisp thoát luôn khỏi ứng dụng.

(Các ngôn ngữ khác thì có vd : Break, Continue, Goto, Exit ... để thoát khỏi vòng lặp)

(defun c:test()
 (setq i 0)
 (repeat 5
   (setq i (1+ i))
   ;(if (= i 2) (exit)) ;(quit))
   )
 (princ i) (princ ))

Cám ơn bạn Gia_bach đã có giải thích về hàm (exit) của lisp. Mình ko rành cái món này nên chỉ góp ý theo phần hiểu biết ít ỏi thôi.

 

 

1). Có trường hợp không thể dùng while được nên nó mới tồn tại // 2 thằng.

2). Trong bài toán: nếu thêm exit khi ok với repeat thì nó lỗi ngay, còn khi thêm đ/k (while (or (...) (/= ok 0)) thì nó dừng lại êm đềm khi ok=0.

3). Dùng while nhanh hơn repeat ở bài toán tổng quát chứ (lặp 1 vòng và lặp 999 vòng mà).

 

1. Bạn Doan Van Ha có thể cho mình 1 ví dụ về việc ko dùng repeat dc ko?

2. Nếu bị lỗi bạn đã tìm hiểu lỗi do đâu chưa?

3. while chạy 1 vòng chậm hơn repeat ở chỗ phải kiểm tra điều kiện lặp. biến kiểm tra là biến ngoài thân hàm -> truy xuất lâu hơn, v.v..

 

Thanks all!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn bạn Gia_bach đã có giải thích về hàm (exit) của lisp. Mình ko rành cái món này nên chỉ góp ý theo phần hiểu biết ít ỏi thôi.

 

 

 

 

1. Bạn Doan Van Ha có thể cho mình 1 ví dụ về việc ko dùng repeat dc ko?

2. Nếu bị lỗi bạn đã tìm hiểu lỗi do đâu chưa?

3. while chạy 1 vòng chậm hơn repeat ở chỗ phải kiểm tra điều kiện lặp. biến kiểm tra là biến ngoài thân hàm -> truy xuất lâu hơn, v.v..

 

Thanks all!

Tôi có thể trả lời được 2 câu hỏi đầu của bạn. Còn câu 3, tôi nói rằng riêng trong bài toán đố vui này thì dùng while tốt hơn, và đã ví dụ 1 với 999. Tôi không thích tranh cãi kiểu thách đố, mong bạn hiểu, nhất là khi chúng ta cùng góp tay xây dựng CV. Còn bạn nếu muốn, đồng thời không ai ý kiến gì thì lúc đó lại là chuyện khác.

Thân thương!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn bạn Gia_bach đã có giải thích về hàm (exit) của lisp. Mình ko rành cái món này nên chỉ góp ý theo phần hiểu biết ít ỏi thôi.

 

 

 

 

1. Bạn Doan Van Ha có thể cho mình 1 ví dụ về việc ko dùng repeat dc ko?

2. Nếu bị lỗi bạn đã tìm hiểu lỗi do đâu chưa?

3. while chạy 1 vòng chậm hơn repeat ở chỗ phải kiểm tra điều kiện lặp. biến kiểm tra là biến ngoài thân hàm -> truy xuất lâu hơn, v.v..

 

Thanks all!

1. Ta thường dùng repeat trong trường hợp biết trước số vòng lặp :) còn while thì thường khi chưa biết số lượng lặp và ta phải xử lý luôn kết quả sau mỗi bước lặp

Ví dụ đơn giản để princ số a đến khi người dùng không nhập nữa

(while (setq a (getint)) (princ a))

Ta sẽ không biết người dùng sẽ nhập bao nhiêu số a. Nó khác với việc nhập hết tất cả các số a rồi sau đó dùng hàm repeat

2. Trong ngôn ngữ lisp, khi repeat, số lần lặp chỉ được tính 1 lần duy nhất vào vòng lặp đầu tiên.

Ví dụ :

(defun c:test()

(setq i 5 j 0)

(repeat (1- i)

(setq j (1+ j))

(if (= j 2)(setq i 1))

(princ j)

)

(princ )

)

3. Repeat cũng phải thực hiện 2 phép tính mặc định sau mỗi vòng lặp : 1 là tăng biến đếm (1+ ), 2 là kiểm tra kết quả này với giới hạn số vòng lặp. Trong 1 số trường hợp, dù thực hiện vùng số vòng lặp tương đương, nếu điều kiện kiểm tra của While đơn giản hơn 2 phép tính trên thì while sẽ nhanh hơn

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tôi có thể trả lời được 2 câu hỏi đầu của bạn. Còn câu 3, tôi nói rằng riêng trong bài toán đố vui này thì dùng while tốt hơn, và đã ví dụ 1 với 999. Tôi không thích tranh cãi kiểu thách đố, mong bạn hiểu, nhất là khi chúng ta cùng góp tay xây dựng CV. Còn bạn nếu muốn, đồng thời không ai ý kiến gì thì lúc đó lại là chuyện khác.

Thân thương!

Sorry nếu làm phật lòng bạn, thật sự mình ko có ý thách đố hay gì cả, chỉ muốn hiểu rõ hơn vấn đề thôi.

Sau một hồi tìm hiểu thì cái error đó là do bản thân trình biên dịch lisp gây ra do cách load của lisp ("List Processing") và đó cũng chính là nguyên nhân ko có hàm nào để thoát khỏi while hay repeat.

 

@Ket: Do đặc thù của lisp (đã nói ở trên) nên Ket ko nhận thấy sự khác biệt của repeat và while nhưng nếu ket có ý định nghiên cứu các ngôn ngữ khác thì nó có khác biệt "chút chút" đấy.

ngoài ra còn vài thứ như

if () else <> cond (select case/switch case/..) về memory

array <> list (static array <> dynamic array) về memory + speed

và nhiều thứ nữa.

Mọi ý kiến của mình chỉ mong các bạn chỉ cho những chỗ sai ko hề có ý thách đố mong các bạn hiểu cho.

 

p/s: em thấy có hàm (vl-exit-with-value) nhưng ko biết cách dùng, bác nào có nhã ý giúp thì em xin trong topic khác kẻo làm loãng topic này.

Thân!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@detailing : :) While thì phải có thoát chứ :) Hì hì. Ketxu cũng chưa hiểu sau bài phân tích ngắn sự khác nhau giữa repeat Detail nói

Do đặc thù của lisp (đã nói ở trên) nên Ket ko nhận thấy sự khác biệt của repeat và while nghĩa mần răng ^^

 

So với các ngôn ngữ khác thì Ketxu thấy lisp khá lỏng lẻo, tuy nhiên, cũng từ cái lỏng lẻo này mà ta luôn luôn có những mẹo và khám phá rất mới ^^ Ngoài ra, với đặc thù luôn trả về giá trị trong 1 cặp biểu thức, ta có thể lạm dụng để rút ngắn rất nhiều thứ. Nếu lisp mà hỗ trợ phần dialog như các ngôn ngữ NET thì...

Ketxu cũng muốn học Net quá, mà thấy ngại nhất khoản máy mình chạy máy người không chạy, các bản Ref dll khác nhau, nên mặc dù thấy ham mà cứ chần chừ mãi tháng này qua tháng khác

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@detailing : :) While thì phải có thoát chứ :) Hì hì. Ketxu cũng chưa hiểu sau bài phân tích ngắn sự khác nhau giữa repeat Detail nói

Do đặc thù của lisp (đã nói ở trên) nên Ket ko nhận thấy sự khác biệt của repeat và while nghĩa mần răng ^^

 

So với các ngôn ngữ khác thì Ketxu thấy lisp khá lỏng lẻo, tuy nhiên, cũng từ cái lỏng lẻo này mà ta luôn luôn có những mẹo và khám phá rất mới ^^ Ngoài ra, với đặc thù luôn trả về giá trị trong 1 cặp biểu thức, ta có thể lạm dụng để rút ngắn rất nhiều thứ. Nếu lisp mà hỗ trợ phần dialog như các ngôn ngữ NET thì...

Ketxu cũng muốn học Net quá, mà thấy ngại nhất khoản máy mình chạy máy người không chạy, các bản Ref dll khác nhau, nên mặc dù thấy ham mà cứ chần chừ mãi tháng này qua tháng khác

lisp (list processing) nghĩa là load hết vào sau đó thực hiện các lệnh theo trình tự từ đầu đến cuối nếu có sự cố giữa đường sẽ sinh ra *error*

file acdbmgd của AutoCAD ko thay đổi theo từng phiên bản như mọi người nghĩ nó bao gồm 2000, 2004, 2007, 2010 tuy nhiên các phiên bản CAD ver sau các dạng chuẩn sẽ có bổ sung thêm các hàm mới nếu muốn dùng dc với phiên bản thấp hơn thì nên tránh dùng các hàm mới đó mà nên tự tạo ra. Cá biệt có phiên bản mới thay hàm trong phiên bản cũ thì developer nên chú ý để kiểm tra ver trước rồi mới quyết định cách xử lý.

 

p/s: chú ý với các bạn nào viết API cho revit (using .NET only) thì API nó thay đổi xoành xoạch mỗi lần update gần như làm lại từ đầu hehe (em hơi lạc đề)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@ Detailing: OK với những gì bạn đang tâm sự.

@ Ketxu: chia sẻ với những gì Ket đang âu tư.

Thực ra, lisp có rất nhiều hạn chế so với các ngôn ngữ khác, mà chán nhất là cái DCL, quá nghèo nàn và quá nhiêu khê.

Bàn "chuyên môn" chút:

Theo thiển ý của tôi, nói chung, repeat nhanh hơn while nếu cùng số lần lặp vì while thường còn phải xét thêm điều kiện đi theo nó. Nhưng nói riêng thì chưa kiểm tra được, ví dụ ta cho (repeat 10^10 và ta cho (while 1 rồi ngắt khi nó thực hiện đúng 10^10 vòng chẳng hạn. Hơi khó để kiểm tra nhỉ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thì cũng tùy lúc thôi ^^ Nói chung e thường dùng while hơn :)

1 Ví dụ thường thấy nhất trong lisp với 1 hàm phổ biến : ss -> ent :

(defun dorepeat (ss / n l i)
(setq n (sslength ss) i -1)
(repeat n
 (setq l (cons (ssname ss (setq i (1+ i))) l))
)
)
(defun dowhile (ss / n l e)
(setq n (sslength ss))
(while (setq e (ssname ss (setq n (1- n))))
 (setq l (cons e l))
)
 )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Gởi bạn Detailing!

Hôm qua chúng ta có bàn đến chuyện nhanh/chậm của repeat/while, và tôi đã có vài nhận định về chúng. Đêm nằm nghĩ lại thì ngộ ra điều này:

1). Ket nói dùng while trong bài đố đó là nhanh hơn repeat (vì nếu while duyệt qua mà đạt y/c thì dừng lặp còn repeat lặp đến hết), tôi đồng ý và đưa ra ví dụ "1 lặp và 999 lặp". Hoá ra điều này quá phiêu lưu, vì ngộ nhỡ cặp sublst đó nó nằm cuối cùng thì số vòng lặp là như nhau, mà có lẽ là mỗi repeat nhanh hơn mỗi while (có ai kiểm tra giùm???) nên lúc này dùng repeat nhanh hơn. Vậy kết luận: nhanh/chậm là hên/xui chăng?

2). Câu đại ý "có khi không dùng while được mà bắt buộc phải dùng repeat" là câu tương đối thôi nhé Detailing! Ý tôi nói là trong trường hợp này dùng repeat chắc chắn nhanh hơn while chứ không phải không thể dùng while, vì với mỗi repeat thì hình như đều có thể dùng while để thay thế được. VD: "(repeat 10" thì có thể thay bằng "(setq x 0) (while (< x 10) (setq x (1+ x))" được.

Bạn nào hiểu rõ hơn thì xin chỉ giáo, đa tạ. Có loãng topic tí, mong thông cảm.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×