Nếu chúng ta lấy trong các hạn chế tài khoản của máy tính thực - ví dụ như bộ nhớ hữu hạn và giá trị hữu hạn các MAX_INT - sau đó, tất nhiên, constexpr (và cũng có thể toàn bộ C++) không phải là Turing-complete. Tuy nhiên, nếu chúng ta sẽ loại bỏ hạn chế này - ví dụ, nếu chúng ta sẽ nghĩ về int như một số nguyên dương hoàn toàn arbitary - thì có, phần constexpr của C++ sẽ được Turing hoàn thành. Nó rất dễ dàng để thể hiện bất kỳ chức năng đệ quy một phần nào.
0, S (n) = n + 1 và bộ chọn I_n^m (x_1, ..., x_n) = x_m và chồng chất rõ ràng có thể được biểu diễn bằng cách sử dụng constexpr.
đệ quy nguyên thủy có thể được thực hiện nó theo cách thẳng:
constexpr int h(int x1, ..., int xn, int y) {
return (xn == 0) ? f(x1, ..., xn) : g(x1, ..., xn, y-1, h(x1, ..., xn, y-1));
}
Và đối với đệ quy một phần chúng ta cần một thủ thuật đơn giản:
constexpr int h(int x1, ... int xn, int y = 0) {
return (f(x1, ... xn, y) == 0) ? y : h(x1, ..., xn, y+1);
}
Vì vậy, chúng tôi nhận được bất kỳ chức năng đệ quy một phần như một constexpr.
Thú vị! Nếu tôi hiểu một cách chính xác, sự khác biệt đó dựa trên thực tế là một chương trình chỉ có thể có một số lượng hữu hạn các đối tượng của thời gian lưu trữ tĩnh, nhưng nó có thể có một số lượng thời gian vô hạn tiềm tàng. Bạn có thể giải thích lý do tại sao? – HighCommander4
@ HighCommander4 Mỗi đối tượng của thời gian lưu trữ tĩnh được giới thiệu bởi một khai báo trong mã nguồn (trong đó chỉ có một số hữu hạn, và mỗi giới thiệu chỉ một số hữu hạn các đối tượng địa chỉ riêng), trong khi đệ quy không giới hạn có thể giới thiệu một số không bị chặn của thời gian. Quan điểm này chỉ áp dụng cho máy trừu tượng C++ - mỗi lần triển khai thực sự cuối cùng sẽ đạt đến một dạng giới hạn tài nguyên nào đó, vì vậy vẫn có một số ràng buộc hữu hạn (nhưng thường không rõ). –
Làm thế nào rất Tóm tắt :-) –