0

では、サルが x の高さのポールを登るのにかかる時間を計算するという課題があります。休憩中に 10 分間で 10 フィート上昇し、10 分間で 3 フィート滑り落ちる場合。ポールの頂上に到達すると停止し、1 分間に 1 フィート上昇します。これは再帰を使用しており、私の方法はこれまでのところ正しいですが、スタックオーバーフローが発生していて、それを回避する方法がわからないので、気が狂っていますか?

みんなありがとう

public static long climb(long height, long time) {    //Recursive method

    if (height <= 0)     //base case
        return time;

/*Every 10 min add 3 to height (notice im doing it backwards, 
instead of substracting 3.
I find it easier to deal with this way and easier to implement the base case) *//

    else if (time != 0 && time % 10 == 0) {    

        return climb(height+3, time+10);
    }

    else  {
        return climb(height-1, time+1);

    } } }
4

2 に答える 2

1

そんなことはできません。次の 2 行で問題が発生する可能性があります。

else if (time != 0 && time % 10 == 0) {    

    return climb(height+3, time+10);
}

たとえば時間が 10 である場合、time-var に 10 を追加し、最終的には 20 になるため、20 % 10 は再び true になります :)

編集:\

くそー、ちょっと遅すぎる:)

別の編集:\

この問題を回避するには、パラメーターにリマインダーを追加します。

    public static long Climb(long height, long time, bool justrested)
    {
        //Recursive method
        if (height <= 0)
        {
            //base case
            return time;
        }

        if(time%10 == 0 && !justrested)
        {
            return Climb(height + 3, time + 10, true);
        }

        return Climb(height - 1, time + 1, false);
    }

次のように呼び出すことができます。

Climb(1800, 0, true);

いくつかの間違いがあるかもしれませんが、とにかくそれを願っています。

于 2013-10-17T05:49:54.287 に答える
1

スタックエラーは、メモリがいっぱいになると発生します。つまり、ここでの問題は、有効な exit ステートメントがないことです。

これをロングに変更してみてください

if (height <= 0L) 

それはおそらく問題を解決するでしょう。

于 2013-10-17T06:02:45.347 に答える