2010-05-10 3 views
4

Я занимаюсь рекурсией, и я не понимаю, почему этот метод не работает. Любые идеи?Базовый рекурсивный метод - factorial

public void fact() 
    { 
     fact(5); 
    } 

    public int fact(int n) 
    { 
     if(n == 1){ 
      return 1; 
     } 
     return n * (fact(n-1)); 
    } 
} 

Благодаря

+3

Что именно вы имеете в виду «не Работа"? Что он делает, и что вы ожидали от этого? –

ответ

12

Ваш код, кажется, работает, но вы ничего не делаете с возвращаемым значением, поставить вызов метода fact или fact(5) внутри System.out.println и посмотреть, что получится.

1

Работает нормально. Вы ничего не назначаете. Вот тест, который докажет, что он работает.

@Test 
public void testYourFactorialMethod() { 
    assertEquals(120, fact(5)); 
} 
+1

Не 'assertEquals()' метод JUnit API? Я предполагаю, что JUnit уже не включен здесь, поэтому вы, вероятно, должны быть немного более явным. Если это обычный метод API, _mea culpa_. – Pops

+0

Да - это JUnit - все, что я пытаюсь показать, это то, что его метод работает. Если вы прочтете мой комментарий, я не предлагаю, чтобы он вставлял мой код в любом месте. – andyczerwonka

-7

Совершенно неправильно писать Фибоначчи с помощью рекурсивных методов!

Это старый известный пример того, как хороший/плохой Algorythm влияет на проект

если вы пишете Fibonatcci рекурсивным для вычисления 120 вам нужно 36 лет toget результат !!!!!!

public static int Fibonacci(int x) 
{ // bad fibonacci recursive code 
if (x <= 1) 
     return 1; 
return Fibonacci(x - 1) + Fibonacci(x - 2); 
} 

в Dot Net 4.0 есть новое имя типа BigInteger, и вы можете использовать его, чтобы сделать лучшую функцию

с использованием системы; с использованием System.Collections.Generic; с использованием System.Numerics; // требуется ссылка. в этой сборке

namespace Fibonaci 
{ 
public class CFibonacci 
{ 
    public static int Fibonacci(int x) 
    { 
     if (x <= 1) 
      return 1; 
     return Fibonacci(x - 1) + Fibonacci(x - 2); 
    } 

    public static IEnumerable<BigInteger> BigFib(Int64 toNumber) 
    { 
     BigInteger previous = 0; 
     BigInteger current = 1; 

     for (Int64 y = 1; y <= toNumber; y++) 
     { 
      var auxiliar = current; 
      current += previous; 
      previous = auxiliar; 
      yield return current; 
     } 
    } 
} 
} 

и вы можете использовать его как

using System; 
using System.Linq; 

namespace Fibonaci 
{ 
class Program 
{ 
    static void Main() 
    { 
     foreach (var i in CFibonacci.BigFib(10)) 
     { 
      Console.WriteLine("{0}", i); 
     } 

     var num = 12000; 
     var fib = CFibonacci.BigFib(num).Last(); 
     Console.WriteLine("fib({0})={1}", num, fib); 

     Console.WriteLine("Press a key..."); 
     Console.ReadKey(); 
    } 
} 
} 

и в этом случае вы можете рассчитывать 12000 менее чем за секунду. так

Использование рекурсивной Митос не всегда хорошая идея

Над кодом импортируемого из Vahid Nasiri blog whiche wrote in Persian

+3

, на вопрос которого вы отвечаете? – Hendrik

+6

Разве он не делает Факториал, а не Фибоначчи? – corsiKa

+3

-1: Хотя рекурсия не может быть оптимальным способом написания факториала, это простой пример введения концепции рекурсии. Не делайте предположений о том, почему спрашивающий задает вопрос. Кроме того, вычисление 120 происходит из факта (5); что, конечно, не требуется 36 лет для обработки. – Pops

6

рекурсии часть штрафа; вы просто не используете его значение return, которое отбрасывается. Вот полное приложение Java вашего факторного кода, слегка Jazzed вверх для образовательных целей:

public class Factorial { 
    public static String fact(int n) { 
     if(n == 1){ 
      return "1"; 
     } 
     return n + " * " + (fact(n-1)); // what happens if you switch the order? 
    } 
    public static void main(String[] args) { 
     System.out.println(fact(5)); 
     // prints "5 * 4 * 3 * 2 * 1" 
    } 
} 
+1

+1 для горячего джаза. – Pops

2

Упрощенная версия кода:

public int fact(int n) 
{ 
    if(n == 1){ 
     return 1; 
    } 
    return n * (fact(n-1)); 
} 

может быть просто:

public int fact(int n) 
{ 
    return n == 1 ? 1 : n * fact(n - 1); 
} 

но ваш код не ошибается, это просто другой стиль (если вы не привыкли к тернарному оператору, держите его так, как есть). Я предпочитаю использовать тернарный оператор в этих случаях (обратите внимание, что код является свободным от побочных эффектов).

+0

Нет ничего плохого в алгоритме, как сказали 3 других плаката 7 часов назад. ОП просто не делал никаких программных выходов. –

+0

Но его стиль кода запутан. Две точки выхода, неявные другие и ненужные скобки. Это моя точка зрения. Вопрос больше, чем ответ. –

+0

Ничего плохого в двух возвратах. Кроме того, новичок, вероятно, будет бороться с пониманием использования условного оператора. – helpermethod

1
public class Recursive { 

    public static void main(String[] argss) { 
     System.out.print(fac(3)); 
    } 
    public static int fac(int n) { 
     int value = 0; 
     if (n == 0) { 
      value = 1; 
     } else { 
      value = n * fac(n - 1); 
     } 
     return value; 
    } 
} 
// out put 6 
1

Попробуйте что-то вроде этого: (Или, может быть, попробовать это прямо)

public class factorial { 

    private static int factorial(int n){ 
     if (n > 1) { 
      return n * (factorial(n-1)); 
     } else { 
      return 1; 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println(factorial(100)); 
    } 
} 
Смежные вопросы