2016-06-28 3 views
0
public class a1 { 

    private static int unit = 0; 

    private static int sum = 0; 

    public static void main(String[] foo) { 
     unit = 10; 
     System.out.println(tailRecur(unit)); 

     System.out.println(tailRecur2(10)); 
    } 

    public static int tailRecur(int result) { 
     int sum = result + unit - 1; 
     unit = unit - 1; 
     if (unit == 0) { 
      return sum; 
     } 
     return tailRecur(sum); 
    } 

    public static int tailRecur2(int unit) { 
     if (unit == 0) return sum; 
     sum = sum + unit; 
     return tailRecur2(unit - 1); 
    } 
} 

Я написал простой метод для достижения 1 + ... + 10. Я не уверен, какой из них может быть лучше со значением синтаксиса рекурсии. Все дают мне правильный ответ.Рекурсия в java, которая может быть лучшей?

+0

функция вызывает себя, что это единственное определение рекурсии, так что это, кажется, основано мнение вопрос –

+6

я бы сказал, что ни один не верный. Они не должны использовать статическое поле. – Andreas

+0

Кроме того, на Java нет разумных реализаций. При достаточно больших значениях 'unit' вы получите StackOverflowError. (Но это, вероятно, «урок №2») –

ответ

3

Сохранение статических переменных не требуется, поэтому любое решение не является идеальным.

Try думать, как этот

  1. Что вы пытаетесь сделать? Ответ: 1+...+N.

  2. Что такое ввод? Ответ: N, максимальное количество в сумме.

  3. Что вы можете сделать на каждом шаге рекурсивно, что поможет вам достичь вашего ответа с помощью этого ввода? Ответ. Возьмите это число и добавьте его в результат всех решений N - 1.

  4. Когда вы должны прекратить рекурсию и начать накапливать результаты суммирования (что ваш базовый случай)? Ответ: Когда число достигает 1 (как правило, наименьший возможный ввод) или даже меньше, чем для предотвращения ввода отрицательного числа из-за ошибки StackOverflow.

public static int sumUpTo(int x) { if (x <= 1) return x; return x + sumUpTo(x - 1); }

+0

Первая строка может быть 'if (x == 1) return x;'. – shmosel

+1

@shmosel Это не поддерживает вызов 'sumUpTo (0)'. Конечно, он не может обрабатывать отрицательные значения в любом случае, но если простой '<' будет поддерживать параметр '0', я бы сказал, что это правильный путь. – Andreas

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