2015-05-03 6 views
2

Вопрос 1Рекурсивная функция java

Напишите рекурсивную функцию, которая возвращает произведение четных чисел между 1 и n.

public static void main(String[] args) { 
    for (int n=0; n<10; n++) 
    { 
     System.out.println("f("+n+") = "+fact(n)); 
    } 
} 

public static int fact(int number) 
{ 
    if(number==2) 
     return 1; 
    else 
    { 
     if(number%2==0) 
      return number*fact(number-1); 
     else 
     { 
      return fact(number-1); 
     } 
    } 
} 

Не знаю, где я здесь делаю неправильно. Пожалуйста, помогите .. спасибо.

+1

Если у вас есть проблемы с вашим кодом, объясните, что именно происходит. Вы получаете ошибку компилятора? Или исключение? Является ли результат неправильным? – Tom

+0

Вопрос не описывает факт, а другую проблему. Вы код больше похож на facturation. Вы просто будете делать возвращаемый номер * факт (номер-2); Начальное значение числа == 2 равно 2 не одному. Затем вам нужно решить, хотите ли вы вообще принимать нечетные числа и настроить петли. – eckes

ответ

0

Оно должно быть:

if(number==2) 
    return 2; 

вы также должны обрабатывать number==0 и number==1, такие как:

if(number==0) 
     return 1; //or 0, it depends on what you want 
    else if(number==2) 
     return 2; 
    else 
    { 
     if(number%2==0) 
      return number*fact(number-1); 
     else 
     { 
      return fact(number-1); 
     } 
    } 
+0

Я изменил его на 2, но у меня все еще есть ошибка в netbeans. – user3807187

+0

@ user3807187 вы также должны обрабатывать 'number == 0' и' number == 1' – locoyou

0

Если изменить это условие:

if(number == 2) 
    return 1; 

Для этого условия:

if(number == 0) 
    return 1; 

Вы получите этот результат:

f(0) = 1 
f(1) = 1 
f(2) = 2 
f(3) = 2 
f(4) = 8 
f(5) = 8 
f(6) = 48 
f(7) = 48 
f(8) = 384 
f(9) = 384 

Может быть, это то, что вам нужно.

0

Когда число = 0 он вызывает факт (-1) -> Факт (номер-1)

когда число = 1 он вызывает факт (0), а затем факт (-1) ... факт (-x)

0

база является тот факт, 2, которое = 2 не 1

открытые статические INT факт (INT число) {

if(number==2) 
     return 2; 
    else 
     return (number%2==0) ? number*fact(number-1): fact(number-1); 

     } 
0

это довольно просто, если вы думаете, рекурсивно :)

public static void main(String[] args) { 
    int n = 10;//Or whatever you want your N to be 
     System.out.println("f("+n+") = "+recursiveEvenProduct(2, n)); 
} 

public static int recursiveEvenProduct(int low, int n) 
{ 
    if(low <= n-2)//Or (low <= n-3) if you don't want to include n 
     return low *= recursiveEvenProduct(low+2, n); 
    return low; 
} 

Это всего лишь один из способов сделать это. Я уверен, что вы можете думать больше.

0
public static int productOfEvens(int n) 
{ 
    if (n > 1) 
     if (n%2 == 0) 
      return n *= productOfEvens(n-1); 
     else 
      return productOfEvens(n-1); 
    return 1; 
} 

Этот метод вызывается, сначала другим методом, а затем рекурсивно сам по себе, N-1 раз с п сокращается на 1 в каждом рекурсивном вызове, пока она не будет снижена до 2. Затем он рекурсивно возвращает к N, собрав все значения четных чисел, которые он передал, умножил рекурсивно. Поскольку результаты быстро становятся огромными, вы можете использовать long вместо int.

+1

Хотя этот ответ, вероятно, правильный и полезный, предпочтительно включить в него некоторое объяснение, чтобы объяснить, как оно помогает решить проблему , Это становится особенно полезным в будущем, если есть изменения (возможно, не связанные), которые заставляют его перестать работать, и пользователи должны понимать, как он работал. –

Смежные вопросы