Tôi quyết định triển khai một chương trình rất đơn giản đệ quy, để xem Java xử lý đệ quy tốt như thế nào, và xuất hiện một chút ngắn. Đây là những gì tôi đã kết thúc bằng văn bản:Tìm int tích cực lớn nhất trong một mảng bằng cách đệ quy
public class largestInIntArray {
public static void main(String[] args)
{
// These three lines just set up an array of ints:
int[] ints = new int[100];
java.util.Random r = new java.util.Random();
for(int i = 0; i < 100; i++) ints[i] = r.nextInt();
System.out.print("Normal:"+normal(ints,-1)+" Recursive:"+recursive(ints,-1));
}
private static int normal(int[] input, int largest) {
for(int i : input)
if(i > largest) largest = i;
return largest;
}
private static int recursive(int[] ints, int largest) {
if(ints.length == 1)
return ints[0] > largest ? ints[0] : largest;
int[] newints = new int[ints.length - 1];
System.arraycopy(ints, 1, newints, 0, ints.length - 1);
return recursive(newints, ints[0] > largest ? ints[0] : largest);
}
}
Và điều đó hoạt động tốt, nhưng vì nó hơi xấu xí, tôi tự hỏi nếu có cách nào tốt hơn. Nếu bất cứ ai có bất kỳ suy nghĩ/lựa chọn thay thế/cú pháp đường để chia sẻ, mà sẽ được nhiều đánh giá cao!
P.s. Nếu bạn nói "sử dụng Lisp" bạn giành chiến thắng không có gì (nhưng tôn trọng). Tôi muốn biết nếu điều này có thể được thực hiện để trông đẹp trong Java.
* và tốt như thế nào tôi xử lý đệ quy
Recursion sẽ không thể đơn giản hoặc hiệu quả trong Java như lặp trừ trường hợp rất hiếm. –
Vâng, nhưng nếu có ai đó chuẩn bị tốt cho không gian phức tạp của đệ quy, thì đó là nhà phát triển Java :) –
Trong bất kỳ ngôn ngữ nào, bạn sẽ luôn phải sao chép mảng hoặc chuyển chỉ mục vào mảng đó. Nếu bạn có nghĩa là "Lisp sử dụng danh sách liên kết", thì chắc chắn, nó đẹp hơn "Java sử dụng mảng", nhưng tôi nghĩ "X sử dụng danh sách được liên kết" đẹp hơn "Y sử dụng mảng" cho bất kỳ X và Y. (Các mảng bị thay thế trong Common Lisp xử lý một ít sổ sách kế toán cho bạn, nhưng tôi không nghĩ chúng thực sự làm cho trường hợp này đơn giản hơn nhiều.) – Ken