Đến nội dung


Hình ảnh
- - - - -

Hỏi về giải thuật


  • Please log in to reply
11 replies to this topic

#1 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 30 November 2010 - 10:44 PM

Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....
Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-B )>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.
Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.
  • 0
Song va chien dau!

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 30 November 2010 - 11:00 PM

Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....
Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-:leluoi:>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.
Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.

Hề hề hề,
Chưa hiểu ý bạn hỏi. Bạn có thể cho một ví dụ cụ thể hay không???
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 30 November 2010 - 11:11 PM

Hề hề hề,
Chưa hiểu ý bạn hỏi. Bạn có thể cho một ví dụ cụ thể hay không???

Ý của e là giống như mình dùng hàm vlookup của excel ấy vlookup thì tìm và trả về các giá trị cần tìm, còn ở đây mình có một bảng sẵn là cơ sở dữ liệu từ trước or mình nhập vào, sau đó mình nhập một số vào từ bàn phím số này được so sánh với lần lượt các giá trị trong bảng rồi trả về một giá trị or string.
Em hỏi là cad có hiểu được nó giống như excel không, mình nên dùng autolisp or vba !
  • 0
Song va chien dau!

#4 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 30 November 2010 - 11:12 PM

Em có một bài toán như thế này: Nhập các số làm cơ sở để so sánh vd: 5 10 15 20 25 ....
Nhập biến a so sánh với lần lượt các biến trên nếu abs(a-:leluoi:>c c có thể mặc định or mình nhập với b là các giá trị trong bảng có sẵn trên thì trả về một kết quả là b or các giá trị khác.
Cái khó của em là chưa biết tạo một dãy số và lưu trữ để so sánh. Mới tập tọe học lisp nên e chưa biết mấy mong chỉ giáo.


Nếu nhiều b thoả mãn thì lấy b ở đầu hay ở cuối ?
Các số cơ sở bạn tạo thành 1 list là giải quyết được vấn đề thôi mà.

Cũng có nhiều bác thức khuya ghê nhỉ?
  • 0

#5 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 30 November 2010 - 11:18 PM

Nếu nhiều b thoả mãn thì lấy b ở đầu hay ở cuối ?
Các số cơ sở bạn tạo thành 1 list là giải quyết được vấn đề thôi mà.

Cũng có nhiều bác thức khuya ghê nhỉ?

Cái b chỉ lấy 1 giá trị thôi chứ bác
ý bác bảo dùng hàm list ấy ah, liệu hàm này có lưu các biến nhập vào để sử dụng vào các lần sau không.
Em đặt bài toán đơn giản như thế náy vd
cơ sở dữ liệu là 5 10 15 20
Nhạp a = 7, so sánh với điều kiện abs(a-:leluoi:>c=3 thì 10 thỏa mãn
Kết quả là cho ra số 10.
Nhưng cơ sở dữ liệu có thể lưu 1 file or tạo thành một bài toán chung được không bác npham/
  • 0
Song va chien dau!

#6 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 30 November 2010 - 11:27 PM

Cái b chỉ lấy 1 giá trị thôi chứ bác
ý bác bảo dùng hàm list ấy ah, liệu hàm này có lưu các biến nhập vào để sử dụng vào các lần sau không.
Em đặt bài toán đơn giản như thế náy vd
cơ sở dữ liệu là 5 10 15 20
Nhạp a = 7, so sánh với điều kiện abs(a-:leluoi:>c=3 thì 10 thỏa mãn
Kết quả là cho ra số 10.
Nhưng cơ sở dữ liệu có thể lưu 1 file or tạo thành một bài toán chung được không bác npham/


Bạn tham khảo đoạn code dưới đây:

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(mapcar '(lambda (x) (if (= (abs (- a x)) c) (setq value x))) csdl)

Đoạn code trên trả ra giá trị value là x, mà ở đó x làm thoả mãn biểu thức. x là 1 phần tử của csdl
csdl có thể ghi dưới file và được load lên thành list.
  • 1

#7 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 30 November 2010 - 11:34 PM

Bạn tham khảo đoạn code dưới đây:

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(mapcar '(lambda (x) (if (= (abs (- a x)) c) (setq value x))) csdl)

Đoạn code trên trả ra giá trị value là x, mà ở đó x làm thoả mãn biểu thức. x là 1 phần tử của csdl
csdl có thể ghi dưới file và được load lên thành list.

Cám ơn bác, cho em hỏi một chút hàm trên em cũng hiểu chút chút nhưng hàm lambda(x) và hàm mapcar bác có thể giải thích một chút cho e được không. VD diễn giải hàm ở dưới.
  • 0
Song va chien dau!

#8 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 30 November 2010 - 11:39 PM

Cám ơn bác, cho em hỏi một chút hàm trên em cũng hiểu chút chút nhưng hàm lambda(x) và hàm mapcar bác có thể giải thích một chút cho e được không. VD diễn giải hàm ở dưới.


Cách viết đó tương đương cách viết này. Tôi chỉ lợi dụng cái hàm mapcar để làm vòng lặp thôi. hehe.
Bạn nên dùng cách viết sau

(setq csdl (list 5 10 15 20 50 1000))
(setq a 7 c 3)

(setq i 0)
(while (setq x (nth i csdl))
(if
(= (abs (- a x)) c)
(setq value x)
)
(setq i (1+ i))
)

  • 1

#9 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 30 November 2010 - 11:43 PM

Hj em tra hàm thì thấy 2 hàm đều hay, có lẽ phải học nhiều để tùy biến các hàm hơn, cám ơn bác npham đã cho bài toán 2 đáp án nhe ! Thanks
  • 0
Song va chien dau!

#10 duyhung

duyhung

    biết vẽ rectang

  • Members
  • PipPip
  • 88 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 01 December 2010 - 12:09 AM

Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....
nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả
Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.
  • 0
Song va chien dau!

#11 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 01 December 2010 - 07:54 AM

Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....
nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả
Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.

+ Trả về số sát với kết quả nhất có thể dùng điều kiện lọc > hoặc < ta được 1 list giá trị, tiếp đó dùng hàm Min hoặc Max để lấy giá trị cần tìm trong list trả về.
+ Nếu muốn chỉ lấy giá trị >40 thì kiểm tra list trả về phải > 40 trước khi dùng điều kiên /a-b/<=10
  • 1

#12 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 01 December 2010 - 08:41 AM

Ah cho e hỏi chút nữa là khi so sánh vd cơ sở có 30 50 100 150 250.....
nhập số liệu 40 với điều kiện kiểm tra là /a-b/<=10 thì có 2 kết quả
Điều kiện trả về dùng số sát và lớn hơn đó là 50 thì dùng hàm j vậy các a.


(setq csdl (list 5 10 6 70 7 15 20 6 7 8))
(setq a 7 c 3)
(setq tap_nghiem (mapcar '(lambda (x) (if (> (abs (- a x)) c) x)) csdl))
(setq tap_nghiem (vl-remove nil tap_nghiem))
(apply 'max tap_nghiem)
Bạn có thể tham khảo đoạn code này.
Hàm mapcar trả ra 1 danh sách chứa các nghiệm thỏa mãn và giá trị nil nếu không thỏa mãn.
Sau khi remove giá trị nil bạn được 1 danh sách chứa nghiệm. Bạn có thể xử lý danh sách này.
hàm apply là 1 ví dụ.

bạn có thể dùng 1 cách viết khác theo vòng lặp và dùng điều kiện lọc để lấy kết quả theo hướng dẫn của bạn natca
  • 1