Tóm lại : Điều mà giáo viên của bạn có thể có nghĩa là ngữ nghĩa của while
hầu hết giống nhau trong hầu hết các ngôn ngữ, trong khi ngữ nghĩa của for
có thể thay đổi đáng kể (xem thảo luận bên dưới). Do đó, bằng chứng độc lập ngôn ngữ trừu tượng đáng tin cậy hơn với a while
, nhưng người ta nên cẩn thận rằng bằng chứng có for
vòng lặp có thể không khớp với ngữ nghĩa của for
vòng lặp trong nhiều ngôn ngữ.
Câu hỏi của bạn không đủ chính xác (mặc dù đó có thể không phải là lỗi của bạn).
Vấn đề là, afaik, không có tiêu chuẩn chính thức, được hỗ trợ ISO, hoặc định nghĩa tham chiếu được chấp nhận chính thức
for
và while
các vòng lặp. Định nghĩa phụ thuộc vào ngôn ngữ lập trình.
Do đó, bạn không thể đưa ra bất kỳ tuyên bố chung nào về sự tương đương của chúng trước khi bạn xác định chính xác những gì mỗi người có thể làm. Tôi nhấn mạnh rằng chính xác hơn, vì đó là một trong những đối số chính được sử dụng trong các câu trả lời khác (và cuộc thảo luận sẽ hữu ích trong phần tiếp theo).
Về khả năng xen kẽ for
và while
các vòng lặp
Tóm tắt : nó phụ thuộc vào ngôn ngữ lập trình, nhưng luôn luôn có thể miễn là bạn có thể có một vòng lặp vô hạn và một cách để thoát khỏi nó.
Nhưng bạn có thể đưa ra tuyên bố như vậy cho một ngôn ngữ lập trình cụ thể và câu trả lời sẽ phụ thuộc vào các tính năng dành cho ngôn ngữ.
Điều đó cũng có nghĩa là không có bằng chứng chung, mà chỉ có một bằng chứng cho mỗi ngôn ngữ lập trình.
Một điều thường đúng là một while
vòng lặp thường có thể bắt chước một for
vòng lặp, bởi vì vòng lặp while có thể thực hiện kiểm tra điều kiện thoát của vòng lặp for, thực hiện khởi tạo biến điều khiển bằng một phép gán trước khi vào vòng lặp và thực hiện tăng ở cuối thân vòng lặp, sao cho
for i from 1 by 2 to 10 do { xxx }
trở thành
i=1
while i≤11 do { xxx; i←i+2 }
Điều này ít nhiều hoạt động đối với hầu hết các ngôn ngữ, nhưng nó không rõ ràng như nó có vẻ như, và có thể có nhiều "chi tiết" phải lo lắng.
Ví dụ, trong nhiều ngôn ngữ, for
vòng lặp đánh giá nó 3 đối số (giá trị ban đầu, gia tăng và giá trị cuối cùng) là các đối số chặt chẽ , được đánh giá một lần trước khi vào vòng lặp, trong khi các đối số khác sẽ lấy các đối số thunk để đánh giá lại ở mỗi lượt, hoặc có thể là đối số lười biếng chỉ được đánh giá khi cần thiết.
Một điểm khác có thể là biến tăng có thể là cục bộ của
for
vòng lặp hoặc phải là biến cục bộ của hàm nơi vòng lặp xuất hiện.
Tùy thuộc vào các vấn đề như vậy, việc dịch từ a for
sang a while
có thể rất khác nhau, mặc dù thường có thể đạt được nó.
Điều tương tự cũng diễn ra đối với converse, điều chỉnh a while
thành một for
vòng lặp.
Vấn đề đầu tiên là một while
vòng lặp sẽ luôn đánh giá lại điều kiện thoát ở mỗi lượt. Nhưng một số for
vòng lặp không cung cấp một điều kiện được đánh giá lại ở mỗi lượt, ngoài việc so sánh biến điều khiển với một số giá trị cố định được tính trên mục vòng lặp. Sau đó, bản dịch là không thể trừ khi có một số ý nghĩa khác để nhảy ra khỏi vòng lặp trên một số điều kiện tùy ý.
Điều đó có thể đạt được với các thiết bị khác nhau, thường bắt đầu bằng câu lệnh có điều kiện kiểm tra điều kiện, theo sau là một bước nhảy được thực hiện, như có sẵn, bằng câu lệnh thoát vòng lặp, câu lệnh return (sau khi đóng gói vòng lặp trong hàm), câu lệnh goto hoặc tăng ngoại lệ.
Nói cách khác, nó lại phụ thuộc rất nhiều vào ngôn ngữ và có thể phụ thuộc vào các tính năng tinh tế của ngôn ngữ.
Điều này nói, như đã được trả lời bởi @milleniumorms , việc xen kẽ rất dễ dàng trong ngôn ngữ C, bởi vì for
lopp về cơ bản là một while
vòng lặp cộng với một số bổ sung cho biến điều khiển tăng dần.
Nhưng điều này không nhất thiết phải áp dụng cho các ngôn ngữ khác, và rất có thể không theo cùng một cách.
Điều này đang được nói, các ngôn ngữ lập trình thường được cho là có sức mạnh Turing chỉ với một trong các vòng lặp này, vì tất cả những gì bạn cần cho nó là một vòng lặp vô hạn. Vì vậy, miễn là bạn có một số cách lặp lại mãi mãi và có thể quyết định dừng lại, bạn khá chắc chắn rằng bạn có thể bắt chước bất kỳ cấu trúc nào khác ... nhưng không nhất thiết phải dễ dàng.
Về bằng chứng
Tóm tắt : Không có lý do nào để tôi khẳng định rằng bằng chứng sẽ khó hơn đáng kể với cái này hay cái kia (trừ khi một số tính năng kỳ lạ của ngôn ngữ).
Có lẽ có một sự hiểu lầm, hoặc giáo viên của bạn có ý nghĩ về một cái gì đó khác.
Ngữ nghĩa chính thức có thể được định nghĩa cho các loại vòng lặp khác nhau được xác định trong các ngôn ngữ lập trình, và sau đó được sử dụng để chứng minh các thuộc tính.
Có thể, một lần nữa tùy thuộc vào ngôn ngữ, việc tiến hành các bằng chứng chính thức liên quan đến các chương trình có thể phức tạp hơn trong một số trường hợp. Nhưng điều đó phụ thuộc vào ngôn ngữ.
Tôi không thể tưởng tượng được một lý do tại sao các bằng chứng sẽ khó hơn đáng kể với một cấu trúc hơn so với cái kia. Các for
vòng lặp có thể phức tạp hơn vì nó có thể cung cấp, như trong C, tất cả những gì được thực hiện với một while
cộng khác thứ. Nhưng nếu bạn đã làm điều đó với một while
, bạn sẽ phải thêm các tính năng bổ sung trong một số hình thức khác.
Tôi có thể sử dụng đối số chung chính thức về khả năng xen kẽ, miễn là có khả năng cho một vòng lặp vô hạn duy nhất. Tuy nhiên tôi sẽ không làm điều đó, vì các công trình liên quan là không có gì bạn muốn giải quyết trong một bằng chứng, và rõ ràng đó sẽ là một tuyên bố không công bằng, ít nhất là trong thực tế.
Tuy nhiên, sau cuộc thảo luận ở trên, chúng tôi đã thấy rằng những khó khăn cho khả năng xen kẽ đến từ sự biến đổi lớn của for
vòng lặp từ ngôn ngữ sang ngôn ngữ. Do đó, kết luận sau đây có lẽ là câu trả lời đúng:
Một khả năng để hiểu câu nói của giáo viên của bạn là ngữ nghĩa của while
vòng lặp khá giống nhau trong tất cả các ngôn ngữ lập trình, trong khi cú pháp và ngữ nghĩa của for
vòng lặp có thể thay đổi đáng kể theo ngôn ngữ. Do đó, có thể đưa ra các bằng chứng "trừu tượng" chung với while
các vòng lặp có ngữ nghĩa độc lập với ngôn ngữ ở mức độ tốt, trong khi điều này là không thể đối với for
vòng lặp có cú pháp và ngữ nghĩa thay đổi quá nhiều từ ngôn ngữ sang ngôn ngữ. Nhưng điều này không áp dụng trong một ngôn ngữ nhất định, khi ngữ nghĩa của cả hai được xác định chính xác.
Đề nghị tốt nhất của tôi là bạn nên hỏi giáo viên của bạn ý nghĩa chính xác của anh ấy, và liệu anh ấy có thể cho bạn một ví dụ. Sai lầm hoặc hiểu lầm là một sự kiện phổ biến.
for
hơnwhile
chỉ đơn giản là không có ý nghĩa. Có thể có một, nhưng đây không phải là nó.