簡體   English   中英

在遞歸Java函數調用中嘗試捕獲放置

[英]Try-catch placement in a recursive Java function call

嘗試在放置遞歸調用時找出放置try catch語句的最佳位置。 使用長數據類型完成因子計算。 當階乘變得太大而無法適應長變量時,期望拋出異常。

但是,只要代碼太大,代碼就會顯示factorial = 0。 沒有例外被拋出。 那么try-catch放置是否存在問題,或者過大的數字是否會引發異常?

class Fact
{
    static long fact(long n)
    {
       if(n==1)
           return 1;
        return n*fact(n-1);
    }

public static void main(String args[])
{
    try{
        long f = fact(555);
        System.out.println("Factorial = "+f);
    }
    catch(Exception e){
            System.out.println("Exception = "+e);
    }
}
}

整數溢出不會在Java中引發任何異常。 整數除以零會拋出ArithmeticException ,但不會溢出。

這個問題現在變成了“為什么這會歸零?” 答案是,這只是一個巧合。 如果你修改這個函數:

static long fact(long n)
{
   if(n==1)
       return 1;
    long result =  n*fact(n-1);
    System.out.println(n + ", " + result);
    return result;
}

然后查看輸出,你得到(我刪除了中間和末尾的一些行):

2, 2
3, 6
4, 24
5, 120
6, 720
7, 5040
8, 40320
...
19, 121645100408832000
20, 2432902008176640000
21, -4249290049419214848
...
60, -8718968878589280256
61, 3098476543630901248
62, 7638104968020361216
63, 1585267068834414592
64, -9223372036854775808
65, -9223372036854775808
66, 0
67, 0
...

然后一旦它達到零,它就永遠為零。 在彈跳並溢出幾次之后,您的產品只是意外地擊中了最低64位的0。 奇怪但真實。

static long fact(long n) throws Exception
    {
       if (//when you want to throw exception){
           throw new Exception();
       }
       if(n==1)
           return 1;
    }

如果你想拋出這樣的異常,你應該手動拋出它。 順便說一下,事實根本不是遞歸的,也不會做你期望的事情。

編寫的代碼將始終返回1.我確定你的意思是有一個帶有return n*fact(n-1)的else塊,但是我沒有看到它。

你可能已經過了很長時間。 我建議你不要用這種方式計算階乘。 最好使用gamma函數進行編碼並加倍:

http://mathworld.wolfram.com/GammaFunction.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM