1

関数型言語 (スキーム) でコラッツ予想 (基本的には偶数を 2 で割り、偶数の場合は 3 を掛けて 1 を足す) を使用しようとしています。明らかな解決策は、剰余を使用して偶数/奇数の 0/1 を見つけ、その両方に対して if ステートメントを使用することです。ただし、if ステートメント、条件、または再帰は使用できません。モジュール 1 で学んだことだけで、基本的な操作と指数、平方根などにすぎません。何か提案はありますか?

4

4 に答える 4

3

問題を避けるため、直接の回答は差し控えさせていただきます。数学の観点からのみ説明します。問題を見てください:

  • 偶数の場合: n/2
  • 奇数の場合: 3*n+1; ただし、3*n+1 = n/2 + 5/2*n + 1 です。

したがって、問題を次のように書き直すことができます。

  • 偶数の場合: n/2 + (5/2*n + 1) * 0;
  • 奇数の場合: n/2 + (5/2*n + 1) * 1;

残りの部分をいつ 0 または 1 で乗算するかを知るには、モジュロ関数を使用できます。

グラングル!!!

于 2013-09-17T15:32:15.283 に答える
1

半分または 3 倍プラス 1 ( hotpo) 関数は、純粋な数学用語で次のように記述できます。

hotpo n = n / 2 + n % 2 * (2.5 * n + 1)

Racket では、この関数を次のように定義できます。

(define (hotpo n)
     (+ (/ n 2) (* (remainder n 2) (+ (* 2.5 n) 1))))

コラッツ予想では、任意の正の数に対して、を繰り返しn適用して一連の数を生成すると、最終的には が得られると述べています。hotpon1

もちろん、コラッツ予想をテストするには、再帰と条件文を利用する必要があります。ただし、hotpo関数自体は、上で示したように、純粋に数学的な用語で定義できます。

于 2013-09-17T16:00:20.450 に答える
1

どの言語をコーディングしたいかはわかりませんが、数学的には、これはコラッツ シーケンスの関数です。

Y をシーケンス内の次の番号、X を現在の番号とします。

Y = (X mod 2) (X/2) + (1 - X mod 2) (3*X+1)

modはモジュロ演算子でありA mod B、 の剰余でA/Bあるため、が偶数であることをX mod 2 = 0意味し、奇数であることを意味します。XX mod 2 = 1X

X mod 2X%2Cにあると思います。

于 2013-10-30T15:59:33.473 に答える
0

カンニングしないでください!そのために大きなトラブルに巻き込まれる可能性があります。

ただし、ヒントを与えることができます。この問題を検討してください。

入力が 1 の場合は 2 を返します。入力が 2 の場合は 1 を返します。条件は使用しないでください。

答え: f(x) = 3-x

于 2013-09-13T06:04:25.270 に答える