Của tôi, tổ ong của những phân biệt thuật ngữ tinh tế. Cái gì thế này"?
fib=0:1:zipWith (+) fib (tail fib)
Đây không phải là hàm đệ quy. Nó không phải là dữ liệu đệ quy. Nó là một định nghĩa đệ quy.
Điều gì đang được xác định?
fib
Loại điều gì là fib
, theo định nghĩa này?
[Integer]
Danh sách số nguyên (hoặc có thể là danh sách bất kỳ công cụ số cũ nào).
Có phải là fib
một hàm không? Không, đó là một danh sách. fib
được xác định đệ quy? Vâng. fib
có được xác định đệ quy nếu chúng tôi thay thế zipWith
bằng một chức năng không phản hồi cùng loại (ví dụ: \ f xs ys -> xs
)? Có, mặc dù nó sẽ là một danh sách được xác định đệ quy khác nhau.
Có phải là fib
danh sách vòng tuần hoàn không? Không. "Cấu trúc dữ liệu đệ quy" có nghĩa là "cấu trúc dữ liệu tuần hoàn" không? Không theo giấy của Hoare, "Cấu trúc dữ liệu đệ quy": http://portal.acm.org/book_gateway.cfm?id=63445&type=pdf&bookpath=%2F70000%2F63445%2Fcb-p217-hoare.pdf&coll=&dl=&CFID=15151515&CFTOKEN=6184618
Trong cài đặt đã nhập, "cấu trúc dữ liệu đệ quy" nghĩa là không nhiều hoặc ít hơn "cư dân của loại được xác định đệ quy". Tương ứng "fred"
là cấu trúc dữ liệu đệ quy, mặc dù nó không được xác định đệ quy, và thực sự nó có thể bị tác động bởi các hàm đệ quy như ++
.
Cụm từ "hàm đệ quy" có nghĩa là "hàm được xác định đệ quy". Cụm từ "giá trị đệ quy" có nghĩa là "giá trị được xác định đệ quy", chẳng hạn như tồn tại trong các ngôn ngữ không nghiêm ngặt: các ngôn ngữ nghiêm ngặt có vấn đề "đệ quy giá trị".
Và nếu bạn nghĩ rằng đó là gàn dở, cố gắng xác định fib
như vậy trong một tổng ngôn ngữ lập trình, và bạn sẽ khám phá ra rằng khái niệm "định nghĩa đệ quy" tách ra thành "định nghĩa bởi đệ quy cơ cấu" (tiêu thụ dữ liệu trong một cách dừng lại) và "định nghĩa bởi corecursion bảo vệ" (sản xuất dữ liệu theo cách mà đi), và rằng fib
là của giống thứ hai. Trong cài đặt đó, năng suất của fib
phụ thuộc rất lớn vào sự lười biếng của zipWith
. Trong thiết lập Haskell, tất nhiên, bạn không cần phải lo lắng về bất kỳ công cụ nào để tìm ra loại định nghĩa gì đó, chỉ để tìm hiểu xem nó có một nửa cơ hội thực sự làm việc hay không.
printf "Ồ không, một hàm có đối số bằng 0, chúng tôi không thể có điều đó!" hay là chết; –
Một 'fib' thực sự. – Ani
'zipWith' là hàm đệ quy, và' fib' là kết quả của nó. Không có gì huyền diệu hay không đệ quy về nó. (Các câu trả lời dưới đây cho rằng có "không có chức năng" là nhầm lẫn như đồng nghiệp của bạn.) –