Bạn sẽ sử dụng hàm được gọi là hàm đệ quy lặp lại, là O (N) theo thời gian khi cần N (N là số từ) lặp và O (1) trong không gian vì mỗi lần lặp trạng thái riêng của nó trong các đối số hàm.
(define (reverse sentence-to-reverse)
(reverse-iter (sentence-to-reverse ""))
(define (reverse-iter(sentence, reverse-sentence)
(if (= 0 string-length sentence)
reverse-sentence
(reverse-iter(remove-first-word(sentence), add-first-word(sentence, reverse-sentence)))
Lưu ý: Tôi đã viết đề án này là một người mới hoàn chỉnh, vì vậy xin lỗi vì thiếu thao tác chuỗi chính xác.
remove-đầu-word thấy ranh giới từ đầu tiên của câu, sau đó mất rằng phần của nhân vật (bao gồm cả không gian và dấu chấm câu) và loại bỏ nó và trả về câu mới
add-đầu-word thấy từ đầu tiên ranh giới của câu, sau đó lấy phần ký tự đó (bao gồm dấu cách và dấu chấm câu) và thêm nó vào câu ngược và trả về nội dung câu ngược mới.
Xin chào, tôi đã tò mò nếu độ phức tạp của lần truyền thứ hai là n + tất cả các từ/2, coz cho mỗi lần truyền trong lần thứ hai bạn đang thực hiện tính toán chiều dài/2, do đó nó có chiều dài từ * wordlength/2 + v.v. .... sửa tôi nếu tôi sai .. – sriks
@sriks: Trong trường hợp này bạn không thể nhân sự phức tạp của bên ngoài với công việc bên trong. Bằng cách sử dụng [Amortized_analysis] (http://en.wikipedia.org/wiki/Amortized_analysis) bạn có thể thấy rằng tổng chi phí của toàn bộ hoạt động reverse_words là tuyến tính. Lưu ý rằng các hoạt động reverse_string trong vòng lặp for được thực hiện cho mỗi từ và có độ phức tạp tuyến tính đến độ dài từ. Điều đó sẽ không bao giờ lớn hơn tổng chiều dài chuỗi. –
@ThomasWatnedal: Tôi nghĩ rằng những gì sriks nói có ý nghĩa, cho phép mang nó theo cách này, bạn có một câu hoặc một chuỗi bao gồm k từ mỗi chiều dài x và cách nhau bởi k-1 không gian có nghĩa là tổng chiều dài của câu = k * x + (k-1), bây giờ xem xét cấu trúc vòng lặp lồng nhau trong đó vòng lặp ngoài làm cho một vượt qua toàn bộ chuỗi và vòng lặp bên trong đảo ngược các từ. Trong mỗi lần đảo ngược bạn thực hiện x/2 hoạt động trên mỗi từ, do đó tổng chi phí đảo ngược = k * x/2 và chi phí của thuật toán là khoảng (k * x)^2 là hàm bậc hai. Bạn có thể biện minh cho lý luận của mình không? – AnkitSablok