Nếu tôi viếtCompile thời gian thẩm định
enum chars = digits ~ uppercase;
chuỗi sẽ được nối tại thời gian biên dịch? Tôi giả định nó sẽ. Nếu tôi thay thế nó bằng một hàm chuỗi hoặc hàm CTFE, tôi không thể đo được bất kỳ sự khác biệt đáng kể nào về hiệu suất (thậm chí gọi nó là một trăm triệu lần). Tôi nhận được một sự khác biệt nếu tôi thay thế enum bằng const. Tôi đã nói với nó là không hiệu quả để viết nó như thế này. Tôi nghĩ nó thuận tiện và tôi không thấy sự thiếu hiệu quả. (BTW, dòng nằm trong một hàm được gọi là đệ quy).
Mã đầy đủ (chuyển đổi sang một hệ thống chữ số với một cơ sở khác nhau)
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r)/b, b) ~ chars[r];
}
Edit: cập nhật mã, để đáp ứng với ý kiến, không liên quan đến câu hỏi
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r)/b, b) ~ c;
}
bạn quên đặt lại chuỗi ký hiệu (bạn có thể sử dụng 'scope (exit) sign =" ";' cho điều đó) để 'toBase (-10,10)' theo sau là 'toBase (10,10)' sẽ cho cùng một kết quả –
Đúng. Ha ha ha, lần đầu tiên tôi sử dụng một biến tĩnh. Khôn lanh. Đó là phạm vi (thoát) điều thực sự hữu ích phải không? Tôi hơi ngạc nhiên khi một cuộc gọi đệ quy không đủ điều kiện để thoát khỏi phạm vi. – fwend
phạm vi (thoát) được thực hiện khi khung ngăn xếp hiện tại được bật lên ngăn xếp (như thử ... cuối cùng thực sự nhưng không có thêm thụt đầu dòng) đệ quy không làm điều đó –