2014-09-06 60 views
0

我有一个简单的递归方法谐:简单的递归方法谐

public static int harmonicOf(int n) 

{ 
    if(n==1) 
    { 
     return 1; 
    } 
    return 1/n + harmonicOf(n-1); 
} 

它总是返回1,我明白为什么做到这一点。我也知道,如果我从int切换到double,那么它也可以工作。

我只是很好奇,为什么这是 - 为什么它是双倍的时候它不会也返回1,并且有没有任何可能的方式使用int

+0

使用整数变量来存储浮动值是没有意义的。所以只是你不能用int来做它。 – Athiruban 2014-09-06 14:28:13

回答

0

如果您使用的是整数1,当n> 2时,n将等于零。 这是因为(例如)1/3实际上是0,因为它是用整数来评估的。 最后当你在多次递归后得到0 + harmonicOf(2-1)时,它会返回1,因为harmonicOf(1)是1.

如果你想修复它,不要使用整数,或双倍。对于n> 1的任何值,这样1/n将被评估为十进制而不是0

1

如果该方法返回一个int,则1/n + harmonicOf(n-1)被评估为int。这意味着1/n对于每个n > 1都是零。这就是为什么1被返回。

如果方法返回float或double,1/n + harmonicOf(n-1)评估为float或double(基于返回类型harmonicOf(n-1))。这就是为什么1/n也被评估为float或double,并且可能不为零。