một tháng trước tôi đã được một số thành viên của Google PTO phỏng vấn. Một trong những câu hỏi là: Đảo ngược một chuỗi đệ quy trong js và giải thích thời gian chạy bằng cách ký hiệu O lớnĐảo ngược chuỗi: Lần đệ quy vs lần lặp trong javascript
này là giải pháp của tôi:
function invert(s){
return (s.length > 1) ? s.charAt(s.length-1)+invert(s.substring(0,s.length-1)) : s;
}
Khá đơn giản, tôi nghĩ.
Và, về ký hiệu lớn-o, tôi nhanh chóng trả lời O (n) khi thời gian chạy phụ thuộc tuyến tính vào đầu vào. - Im lặng - và sau đó, anh ta hỏi tôi, sự khác biệt về thời gian chạy nếu bạn thực hiện nó bằng cách lặp lại là gì?
Tôi trả lời rằng đôi khi trình biên dịch "dịch" đệ quy thành lặp lại (một số ký ức ngôn ngữ lập trình) nên không có sự khác biệt về lặp lại và đệ quy trong trường hợp này. Btw vì tôi không có phản hồi về câu hỏi cụ thể này, và người phỏng vấn không trả lời "ok" hoặc "nope", tôi muốn biết liệu bạn có thể đồng ý với tôi hay không, nếu bạn có thể giải thích cho tôi biết 2 loại triển khai.
Cảm ơn rất nhiều và Kính trọng!
Tôi không chắc chắn, nhưng có thể có chi phí phát sinh cuộc gọi trong quá trình đệ quy, sẽ không có trong một vòng lặp. –
Btw tôi đã lưu trữ s.length thay vì truy cập nó 3 lần, nhưng có lẽ không cần tối ưu hóa ... (xin lỗi tôi luôn tối ưu hóa sớm, đó là một trong nhiều lỗi của tôi) –
@Martin: gọi stack thế hệ nên là một * rất nhỏ * trên không. Trong mọi trường hợp, mã ở đây đệ quy n lần, nó có độ phức tạp tính toán giống như một vòng lặp lặp lại n lần. – Juliet