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

Lập trình lisp cơ bản

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

Em chào mọi người ạ, em là sinh viên mới học về cad và lisp. Em có 2 bài tập chưa biết làm ạ:

1. tạo hàm tính mũ: Mu (A n), với n nguyên.

2. tính tổng dãy số đổi dấu TDD n, ví dụ n=8 thì chương trình sẽ tính 8-7+6-5+4-3+2-1; n=7 thì sẽ là -7+6-5...-1

(câu 2 em có thử làm như sau: (DEFUN TDD (X)
  (SETQ Y (REM X 2))
  (IF (= Y 0) (- X (+ (- X 1) (TDD (- X 2))) 1)) (+ X (- (- X 1)) (TDD (- X 2))) 1)

nhưng máy báo lỗi: Hard error occurred ***
internal stack limit reached (simulated) )

 

Mong các anh chị giúp em ạ, em cảm ơn mọi người!

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

Bạn mới học lisp mà đã viết kiểu đệ qui rồi. Đệ qui nếu làm không khéo dễ tạo vòng lặp dài vô tận, đó là lỗi bạn gặp phải.

Tôi có cách viết đơn giản hơn dùng repeat.

(defun tdd (x / S KQ) 
	(setq s x
				kq 0)
	(repeat s
		 (setq kq (if (= (rem x 2) 0) (+ kq x) (- kq x))
					 x (1- x))
	) kq
)

 

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

dạ, em cảm ơn ạ!

em có thể thử làm câu 1 với repeat được không ạ?

23 phút trước, 7o7 đã nói:

Bạn mới học lisp mà đã viết kiểu đệ qui rồi. Đệ qui nếu làm không khéo dễ tạo vòng lặp dài vô tận, đó là lỗi bạn gặp phải.

Tôi có cách viết đơn giản hơn dùng repeat.

  • cadvietlisp.lsp
    lisp help
  •  

(defun tdd (x / S KQ) 
	(setq s x
				kq 0)
	(repeat s
		 (setq kq (if (= (rem x 2) 0) (+ kq x) (- kq x))
					 x (1- x))
	) kq
)

 

 

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 ra bài 2 là đánh lừa SV lập đệ quy hoặc vòng lặp, nhưng thực chất rất đơn giản như này:


(defun TDD(n)
 (if (= (rem n 2) 0)
  (/ n 2)
  (/ (+ n 1) -2)))

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
Vào lúc 24/4/2022 tại 11:03, Doan Van Ha đã nói:

Thực ra bài 2 là đánh lừa SV lập đệ quy hoặc vòng lặp, nhưng thực chất rất đơn giản như này:


(defun TDD(n)
 (if (= (rem n 2) 0)
  (/ n 2)
  (/ (+ n 1) -2)))

 

Bác này chắc xưa học toán tin rồi. Viết code ra giấy thì mới có tư duy ngắn gọn như vậy. :))

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
16 phút trước, tannguyen291 đã nói:

Bác này chắc xưa học toán tin rồi. Viết code ra giấy thì mới có tư duy ngắn gọn như vậy. :))

Đoán trúng chữ T đầu, nhưng từ 45 năm trước cơ.

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

×