2016-04-14 33 views
6

Cố gắng tạo một phương thức đệ quy làm tăng giá trị kép thành lũy thừa int cho một khóa học java. Các hướng dẫn nói "Tuy nhiên, viết mã để khi n là ngay cả các phương pháp sẽ trở lại (x^(n/2))^2."Loại toán hạng hạng nặng cho toán tử nhị phân '^'

Đây là những gì tôi có cho đến nay:

 public static double powerFaster(double x, int n) { 
     if (n == 0) { 
      return 1; 
     } 
     else if ((n % 2) == 0) { 
      return ((x^(n/2.0)^2.0)); //Error occurs here. 
     } else { 
      return x * powerFaster(x, (n - 1)); 
     } 
    } 
+1

câu hỏi của bạn là gì? – ehh

Trả lời

16

^ là một nhà điều hành XOR, không quyền lực. Sử dụng Math.pow() để cấp nguồn.

Điều đó nói rằng, tôi nghĩ bạn đã bỏ lỡ điểm tập thể dục.

Bạn nên return powerFaster(x, n/2) * powerFaster(x, n/2); khi n thậm chí (thực sự thực hiện một cuộc gọi đệ quy, lưu trữ kết quả của nó trong một biến và nhân nó một mình).

public static double powerFaster(double x, int n) { 
    if (n == 0) { 
     return 1; 
    } 
    else if ((n % 2) == 0) { 
     double pow = powerFaster(x, n/2); 
     return pow * pow; 
    } else { 
     return x * powerFaster(x, (n - 1)); 
    } 
} 
+0

Cảm ơn bạn đã trả lời và cho tôi biết rằng miếng ngon khác. Tôi nghĩ rằng tôi được cho là phải thực hiện một phương pháp đệ quy cho phần đó nhưng không thực sự chắc chắn là cách tốt nhất để làm điều đó. –

6

^ được Bitwise XOR, sử dụng với số nguyên:

int a = 6; //00000110 
int b = 5; //00000101 
int c = a^b; //gives you 3 = 00000011, not 6^5 

Các hoạt động là ở mức nhị phân:

00000110 //a 
00000101 //b 
--------- XOR 
00000011 

Thực hiện quyền lực, sử dụng Math.pow():

Math.pow(2.0, 1.0) //gives you 2.0 
8

Nếu bạn đang làm điều này cho tốc độ, bạn muốn tránh sử dụng Math.pow vì đây là chức năng bạn đang cố thay thế.

Để có được một hình vuông của một giá trị mà bạn có thể làm d * d

public static void main(String[] args) { 
    System.out.println(powerOf(2, 9)); 
} 

public static double powerOf(double d, int n) { 
    if (n < 0) return 1/powerOf(d, -n); 

    double ret = 1; 
    if (n > 1) 
     ret = powerOf(d * d, n/2); 
    if (n % 2 != 0) 
     ret *= d; 
    return ret; 
} 

in

512.0 
2

Trên một mặt lưu ý đừng quên rằng Math.pow là một hoạt động thực sự nặng nề, nếu bạn chỉ sử dụng nó cho hình vuông hoặc hình khối, bạn nên làm điều đó với * toán tử hoặc thậm chí cho các vòng lặp

Mult with * operator took 4ms

Mult với pow toán mất 717ms

Mult với vòng lặp for mất 4ms

Chỉ với hoạt động khối trong một thử nghiệm, thực hiện một triệu lần

+1

Ghi chú bên phải là nhận xét không phải là câu trả lời. –

+0

Đáng buồn thay, tôi không có đủ nghiệp để bình luận: / – Webster

Các vấn đề liên quan