Hãy tưởng tượng tôi đã xác định một thừa đệ quy trong Mathematica, như thế này:Trong Mathematica, tại sao nó thay thế trong một hàm đệ quy không kết thúc?
Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]
Đánh giá thực tế [10] khẳng định rằng chức năng hoạt động và chấm dứt.
Một chút ví dụ chủ yếu, nhưng nó phục vụ mục đích của nó trong câu hỏi này. Trên thực tế, câu hỏi của tôi liên quan đến định nghĩa chức năng đệ quy nói chung anyway.
tôi mong đợi đánh giá thay thế sau để chấm dứt cũng như:
x fact[x-1] /. x -> 2
Alas, nó chạy vào một giới hạn độ sâu đệ quy:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.
tôi mong đợi để xem một cái gì đó như:
2 fact[2-1]
hoặc chỉ giá trị
2
UPDATE: Một định nghĩa đệ quy thay thế thực tếkhông công việc như mong đợi:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]
Nhưng thực tế này (ý định chơi chữ ;-) làm cho nó thậm chí còn bí ẩn hơn với tôi: Tại sao nó cư xử rất khác nhau?
Câu hỏi của tôi là hai khía cạnh:
Ngay cả với built-in giúp đỡ và tìm kiếm trên net cho manh mối, tôi không thể giải thích tại sao Mathematica khẳng định trong, rõ ràng, giữ kết quả mang tính biểu tượng, chứ không phải là đánh giá kết quả 'trung gian' và chấm dứt độc đáo. Ai mạo hiểm một giải thích khả thi?
Làm cách nào tôi có thể thuyết phục Mathematica thực hiện theo yêu cầu của tôi (Ngoài việc sử dụng phương án thay thế bằng cách sử dụng Nếu [])?
Tôi thực sự bối rối vì điều này và tôi thực sự hy vọng một người nào đó có thể giúp tôi.
/Twan
Aha, điều đó có ý nghĩa: Mathematica đầu tiên đánh giá LHS của /. và _then_ thực hiện việc thay thế.Và với Hold [] bạn có thể hoãn đánh giá 'háo hức' đó. Cảm ơn câu trả lời tuyệt vời: hiệu quả, có liên quan, rõ ràng và ngắn gọn! Lời khen của tôi – nanitous
@nanitous Chúc mừng! Nếu một trong ba câu trả lời không trả lời câu hỏi của bạn, bạn có thể đánh dấu câu trả lời đó là câu trả lời được chấp nhận để câu trả lời xuất hiện ở đầu (và nó mang lại sự nổi tiếng cho người trả lời). – acl
cảm ơn vì đã chỉ ra điều đó! – nanitous