Dưới đây là một chương trình đơn giản mà thổi đống của tôi để Kingdom Come:Haskell Các vấn đề với Parameter Passing Phong cách Heap
intersect n k z s rs c
| c == 23 = rs
| x == y = intersect (n+1) (k+1) (z+1) (z+s) (f : rs) (c+1)
| x < y = intersect (n+1) k (z+1) s rs c
| otherwise = intersect n (k+1) z s rs c
where x = (2*n*n) + 4 * n
y = (k * k + k)
f = (z, (x `div` 2), (z+s))
p = intersect 1 1 1 0 [] 0
main = do
putStr (show p)
gì chương trình làm là tính toán giao điểm của hai chuỗi dài vô tận, dừng lại khi nó đạt đến 23 yếu tố. Nhưng điều đó không quan trọng với tôi.
Điều thú vị là theo như tôi có thể nói, không nên có nhiều ở đây đang ngồi trên đống. Các chức năng giao nhau là đệ quy với tất cả các cuộc thám hiểm được viết như cuộc gọi đuôi. Nhà nước được tích lũy trong các đối số, và không có nhiều của nó. 5 số nguyên và một danh sách nhỏ các bộ dữ liệu.
Nếu tôi là một cá cược, tôi sẽ cá rằng một số phần được xây dựng trong các đối số khi tôi thực hiện đệ quy, đặc biệt là đối số không được đánh giá trên đệ quy đã cho. Nhưng đó chỉ là một linh cảm hoang dã.
Vấn đề thực sự ở đây là gì? Và làm thế nào để sửa chữa nó?
Tôi có cảm giác hai loạt không giao nhau Muth. Hãy thử giảm c và in ra n và k. –
Chúng không cắt nhau nhiều, nhưng chúng cắt nhau đủ. Nếu tôi giảm từ c xuống 10, chương trình sẽ trả về trong một eyeblink. Nhưng ngay cả như vậy, nếu chương trình đã không chấm dứt vì c == 23 chưa bao giờ gặp nhau, không nên nó chỉ tái sử dụng mãi mãi trong không gian liên tục? –