関数型言語 (スキーム) でコラッツ予想 (基本的には偶数を 2 で割り、偶数の場合は 3 を掛けて 1 を足す) を使用しようとしています。明らかな解決策は、剰余を使用して偶数/奇数の 0/1 を見つけ、その両方に対して if ステートメントを使用することです。ただし、if ステートメント、条件、または再帰は使用できません。モジュール 1 で学んだことだけで、基本的な操作と指数、平方根などにすぎません。何か提案はありますか?
4 に答える
問題を避けるため、直接の回答は差し控えさせていただきます。数学の観点からのみ説明します。問題を見てください:
- 偶数の場合: 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 で乗算するかを知るには、モジュロ関数を使用できます。
グラングル!!!
半分または 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
適用して一連の数を生成すると、最終的には が得られると述べています。hotpo
n
1
もちろん、コラッツ予想をテストするには、再帰と条件文を利用する必要があります。ただし、hotpo
関数自体は、上で示したように、純粋に数学的な用語で定義できます。
どの言語をコーディングしたいかはわかりませんが、数学的には、これはコラッツ シーケンスの関数です。
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
意味し、奇数であることを意味します。X
X mod 2 = 1
X
X mod 2
X%2
Cにあると思います。
カンニングしないでください!そのために大きなトラブルに巻き込まれる可能性があります。
ただし、ヒントを与えることができます。この問題を検討してください。
入力が 1 の場合は 2 を返します。入力が 2 の場合は 1 を返します。条件は使用しないでください。
答え: f(x) = 3-x