-6

期末試験に向けてテキストで勉強中。この問題が解けなかったので答えを教えてください。

1) 2 つの整数を取り、それらの乗算の結果を返す関数multiply(int a, int b) の再帰的な定義を記述します。

私は答えました:

Multiply(a, b) :
0 - if a or b is equal to zero.   (I got -1 here. Reason written: only 1)
a * b - (I didn't know what to write here)

2) 整数の連結リストを受け取り、その要素の合計を返す再帰メソッドを作成します。

私の解決策は次のとおりです。

int sumList(Node<Integer> list) {

    int temp = list.getInfo();

    if(temp == null) {
        return 0;

    } else {
        return temp + sumList(temp.getNext);
    }
}

私はそれを修正しました、私は思う:

 public int sumList(Node<Integer> list) {

    Node<Integer> temp = list;

    if(temp == null) {
        return 0;

    } else {
        return temp.getInfo() + sumList(temp.getNext());
    }
}

問 2 の正解は正しいですか。

4

3 に答える 3

3

これは試験の準備のためなので、これを行うためのコードは提供しません。代わりに、いくつかのアイデアを提供します。

質問 1 について。掛け算は足し算の繰り返しなので、ここではそれを再帰のベースとして使用できます。

3 * 4 を見つけたい場合は、再帰を使用して 4 + 4 + 4 を計算して返します。

つまり、下にパターンが浮かび上がってくるのがわかります。

4 * 3 = 4 + (4 * 2)

4 * 3 = 4 + 4 + (4 * 1)

于 2013-05-31T08:26:58.817 に答える
0

A)ええと、再帰に関するその章をもう一度読む必要があります。

数学的原理は次のとおりです。

http://en.wikipedia.org/wiki/Mathematical_induction

ウィキペディアの記事では、はるかに複雑なタスクを順を追って説明しています。

B) いいえ、まったくコンパイルされません。複数の構文エラーがあります。

プログラミングのスキルを磨くために、Java コンパイラを使用してみてください。

于 2013-05-31T08:25:54.617 に答える
0

機能する再帰的なソリューションを得るには、たとえばのようなベース ケースa == 0が必要です。次に、自分自身を再帰的に呼び出してベース ケースに向かって作業を進めます。

a質問 1 の解決策は、次のようなもので、次のようになるまで引数を減らし0ます。

int multiply(int a, int b) {
    if (a == 0 || b == 0) {
        return 0;
    } 
    return b + multiply(a - 1, b);
}

たとえば、-> ->multiply(2, 5)になります。5 + multiply(1, 5)5 + 5 + multiply(0, 5)5 + 5 + 0

この特定の解決策は負の数では機能しないことに注意してください。そのためのサポートを自分で簡単に追加できるはずです。

于 2013-05-31T08:26:50.943 に答える