2015-05-24 4 views
1

Итак, я задал следующую проблему: У нас есть кролики, стоящие в линии, пронумерованные 1, 2, ... У нечетных кроликов (1, 3, ..) есть нормальные 2 уха. Четные кролики (2, 4, ..), мы скажем, имеем 3 уха, потому что каждый из них имеет поднятую ногу. Рекурсивно возвращаем количество «ушей» в линии 1, 2, ... n (1), (без циклов или умножения).Рекурсивные упражнения

и вот мой исходный код. Я использую Java

import java.util.Scanner; 

public class BunnyEars 
{ 
    public static int CountEars(int i, int e) 
    { 
     if(i == 0) 
     { 
      return e; 
     } 
     else if(i > 0) 
     { 
      if(i%2==0) 
      { 
       e = e + 2; 
       i = i - 1; 
       CountEars(i,e); 
      } 
      else 
      { 
       e = e + 3; 
       i = i - 1; 
       CountEars(i,e); 
      }  
     } 
     return e; 
    } 

public static void main(String []args) 
{ 
    Scanner scan = new Scanner(System.in); 

    int b; 
    int result; 

    System.out.println("Bunny Ears, even has 2 ears, odd has 3 ears"); 
    System.out.println("Please enter a value: "); 
    b = scan.nextInt(); 

    result = CountEars(b,0); 

    System.out.println("Number of ears are: " + result); 
} 

Если я вхожу 5 выход должен быть 12, но выход 3. Так что я думаю, что CountEars (я, е) метод в

enter code here 

if(i%2==0) 
     { 
      e = e + 2; 
      i = i - 1; 
      CountEars(i,e); 
     } 
     else 
     { 
      e = e + 3; 
      i = i - 1; 
      CountEars(i,e); 
     } 

не выполнения. Кажется, я не могу найти свои ошибки. Кто угодно?

+0

Используйте отладчик + некоторые 'sysouts'. –

+2

Вы думаете, что это не выполняется? Вы пробовали вставить System.out.println («ЗДЕСЬ!») В блок, если он действительно не выполняется? – Zavior

+0

Вы добавляете к локальному аргументу метода 'int e'. Это уникально для каждого вызова метода. Вам нужно либо вернуть число ушей обратно к вызывающей функции, либо (как утверждают ответы) использовать независимое целое число для хранения вашего количества ушей. – GiantTree

ответ

-1

попробовать этот коду

import java.util.Scanner; 

public class BunnyEars { 

static int e=0; 
public static int CountEars(int i) { 
    if (i == 0) { 
     return e; 
    } else if (i > 0) { 
     if (i % 2 == 0) { 
      e = e + 2; 
      //i = i - 1; 
      CountEars(i-1); 
     } else { 
      e = e + 3; 
      //i = i - 1; 
      CountEars(i-1); 
     } 
    } 
    return e; 
} 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 

    int b; 
    int result; 

    System.out.println("Bunny Ears, even has 2 ears, odd has 3 ears"); 
    System.out.println("Please enter a value: "); 
    b = scan.nextInt(); 

    result = CountEars(b); 

    System.out.println("Number of ears are: " + result); 
} 
} 
+0

Почему? Пожалуйста, объясните, что вы изменили. –

+0

Я не передаю e в методе, и я ставлю его как глобальную переменную. –

+0

Проблема заключается в том, что «e reset каждый рекурсивный вызов, и взял значение с первого вызова 5» –

1

В вашем рекурсивном методе вы не в общей сложности возвращаемых значений из других кроликов в строке. Кроме того, вам нужен только один аргумент - этот кролик находится на рассмотрении.

/* 
* Return the total number of ears in a line of length n 
*/ 
public static int countEars(int n) { 
    if (n < 1) { 
     return 0; // base case: no bunnies, no ears 
    } 
    // Below we make the "recursive leap of faith": if this 
    // function works, we can get the answer for a line of n-1 
    // bunnies and add the current bunny's ears to it to yield 
    // the correct answer for the current value of n. 
    // Note that the argument to the recursive call must 
    // converge towards the base case for this to work. 
    if (n % 2 == 1) { 
     return 2 + countEars(n-1); 
    } 
    return 3 + countEars(n-1); 
} 

Вызовите это с помощью result = countEars(5);.

Обратите внимание, что я переименовал ваш метод и следуя соглашениям Java.

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