我正在練習遞歸,我看不出爲什麼這個方法似乎不起作用。 任何想法?基本的遞歸方法 - 階乘
public void fact()
{
fact(5);
}
public int fact(int n)
{
if(n == 1){
return 1;
}
return n * (fact(n-1));
}
}
感謝
我正在練習遞歸,我看不出爲什麼這個方法似乎不起作用。 任何想法?基本的遞歸方法 - 階乘
public void fact()
{
fact(5);
}
public int fact(int n)
{
if(n == 1){
return 1;
}
return n * (fact(n-1));
}
}
感謝
你的代碼似乎工作,但你沒有做與返回的任何有價值的東西,把方法調用fact
或fact(5)
一個System.out.println
的內部,看看你會得到什麼。
工作正常。你沒有把它分配給任何東西。這是一個可以證明它有效的測試。
@Test
public void testYourFactorialMethod() {
assertEquals(120, fact(5));
}
不是'assertEquals()'一個JUnit API方法嗎?我猜JUnit尚未在這裏啓用,所以你應該更明確一些。如果它實際上是一個常規的API方法,_mea culpa_。 – Pops 2010-05-10 13:25:48
是的 - 這是JUnit - 我試圖展示的是他的方法有效。如果你閱讀我的評論,我不建議他在任何地方插入我的代碼。 – andyczerwonka 2010-05-10 16:42:09
用遞歸方法寫斐波納契是完全錯誤的!
這是因爲如果你寫Fibonatcci遞歸,計算120
你需要36年toget結果的好/壞Algorythm如何影響任何項目
昔日經典例子!!!!!!
public static int Fibonacci(int x)
{ // bad fibonacci recursive code
if (x <= 1)
return 1;
return Fibonacci(x - 1) + Fibonacci(x - 2);
}
在
點網4.0有一個新的類型名稱BigInteger和你可以用它來製作使用系統更好的功能
; using 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
少。所以
使用遞歸methos並不總是一個好主意
遞歸部分是精細導入的代碼;你只是沒有使用它的return
值,它會被丟棄。這裏是你的階乘代碼一個完整的Java應用程序,小幅飲譽式教育目的:
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熱爵士樂。 – Pops 2010-05-10 13:30:55
你的代碼的簡化版本:
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);
}
但是你的代碼沒有錯,這只是另一種風格(如果你不習慣三元運算符保持它的方式)。我更喜歡在這些情況下使用三元運算符(注意代碼是無副作用的)。
算法沒有錯,就像7小時前其他3個海報所說的那樣。 OP只是沒有做任何程序輸出。 – 2010-05-10 21:04:06
但他的代碼風格令人困惑。兩個出口點,一個不明確的別名和不必要的括號。這是我的觀點。問題不僅僅是回答。 – 2010-05-11 10:20:08
這兩個退貨沒有錯。此外,初學者可能會難以理解條件運算符的使用。 – helpermethod 2010-05-12 23:10:31
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
static int factorial(int x) {
int result;
if (x == 1) {
return 1;
}
// Call the same method with argument x-1
result = factorial(x – 1) * x;
return result;
}
對於完整的例子檢查這個
http://answersz.com/factorial-program-in-java-using-recursion/
嘗試是這樣的: (或者,也許試試這個直接)
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));
}
}
究竟是什麼意思「不工作」?它做什麼,你期望它做什麼? – 2010-05-10 13:08:13