2013-02-02 28 views
6

tôi đang học về đệ quy và tôi đã xem qua câu hỏi này:Thuộc tính nào phải có ngôn ngữ để hỗ trợ đệ quy?

FORTRAN implementations do not permit recursion because 

a. they use static allocation for variables 

b. they use dynamic allocation for variables 

c. stacks are not available on all machines 

d. it is not possible to implement recursion on all machines. 

tôi phát hiện ra rằng câu trả lời là (a)

Nhưng tôi muốn biết tất cả các tính năng mà một ngôn ngữ lập trình nên phải hỗ trợ đệ quy.

ai đó có thể vui lòng giải quyết nghi ngờ của tôi

Cảm ơn trước

+0

Đồng ý, chào mừng bạn đến với scicomp và cảm ơn câu hỏi. Chỉ cần để lặp lại tất cả mọi thứ Deer Hunter cho biết, chúng tôi có rất nhiều người dùng Fortran trong cộng đồng này, nhưng chúng tôi thường không xử lý các câu hỏi lập trình chung như thế này. Tôi sẽ di chuyển cái này sang StackOverflow. –

+0

Ok tôi hiểu rồi. Cảm ơn bạn đã di chuyển –

+2

Tôi đoán điều duy nhất bạn cần là: các hàm và biến cục bộ và không gian lưu trữ đối số cho mỗi lời gọi hàm. Điểm a. trong câu hỏi của bạn dường như gợi ý rằng không gian lưu trữ được tái sử dụng trên các lời gọi hàm. – jackrabbit

Trả lời

4

biến địa phương trong một chức năng hoặc chương trình con (bao gồm cả địa chỉ trả lại của nó) phải là một bản sao tươi bất cứ khi nào nó được gọi.

Thông thường việc này được thực hiện bằng cách sử dụng kiến ​​trúc ngăn xếp. Bất cứ khi nào một hàm được gọi, các đối số của nó được đẩy lên ngăn xếp, sau đó địa chỉ trả về của nó được đẩy, sau đó một khối bộ nhớ cũng được "đẩy" (bằng cách giảm con trỏ ngăn xếp xuống một lượng vừa đủ). Một thanh ghi đặc biệt, "con trỏ khung" được đặt chỉ vào bộ nhớ đó, và hàm này đề cập đến tất cả các biến cục bộ của nó bằng cách tham chiếu tới thanh ghi đó.

Các ngôn ngữ khác không sử dụng ngăn xếp phần cứng vật lý, nhưng ngôn ngữ hợp lý được triển khai dưới dạng danh sách được liên kết, nhưng nguyên tắc thì giống nhau.

Vì Fortrans ban đầu không có khái niệm này và lưu trữ tất cả các biến tại các vị trí toàn cầu cố định, một cuộc gọi đệ quy sẽ bị lỗi hoặc treo. Ví dụ, nếu một cuộc gọi B gọi C gọi B, sau đó B trở về C, mà trở về B, mà trở về C, infinitum quảng cáo, bởi vì B chỉ có thể nhớ một địa chỉ trở lại.

calls: A -> B -> C -> B 

returns:  B <- C <- B 
      B -> C 

Hơn nữa, tất cả biến cục bộ và đối số của cuộc gọi đầu tiên đến B bị ghi đè khi cuộc gọi thứ hai đến B xảy ra.

1

Câu hỏi trắc nghiệm mà người hỏi hỏi là một câu hỏi gây hiểu lầm, bởi vì trong khi phiên bản cũ nhất của ngôn ngữ thiếu hỗ trợ đệ quy, có các phiên bản hiện đại của ngôn ngữ FORTRAN cho phép đệ quy.

Cho dù triển khai ngôn ngữ có hỗ trợ đệ quy hay không nên được coi là vấn đề cách ngôn ngữ của ngôn ngữ xác định chức năng và mức độ phù hợp của việc triển khai.

Các vấn đề liên quan