私はSchemeにかなり慣れていないので、自分でゼロから学ぼうとしています。私はこの問題の構文に固執しています。たとえば、Cの場合、数値が2の累乗であるかどうかを知りたい場合は、次のようにします。
return (x & (x - 1)) == 0;
これはtrueまたはfalseを返します。これをSchemeでいくつかの単純な行に変換するにはどうすればよいですか?
私はSchemeにかなり慣れていないので、自分でゼロから学ぼうとしています。私はこの問題の構文に固執しています。たとえば、Cの場合、数値が2の累乗であるかどうかを知りたい場合は、次のようにします。
return (x & (x - 1)) == 0;
これはtrueまたはfalseを返します。これをSchemeでいくつかの単純な行に変換するにはどうすればよいですか?
あなたが言語を学ぼうとしているので、私はあなたにヒントを与えます。
スキームには、Cの演算子(bitwise-and ...)
と同等のと呼ばれる関数があります(期待されることを行う、、などもあります)。&
(bitwise-xor ...)
(bitwise-not ..)
(ここに関数のドキュメントがあり(bitwise-and ...)
ます)
それを踏まえて、質問に書き込んだ内容をスキームコードに変換できますか?
注意:このような問題の場合、Schemeを使用するときにビット演算に頼る必要はありません。現実的には、これを計算する(おそらくテールの)再帰関数を作成する必要があります。
これは、組み込みのビット演算子を使用して行うことができます。
(define (pow2? x)
(= (bitwise-and x (- x 1))
0))
スキームには、バイワイズ演算子もあります。
しかし、本当にスキームスキルを身に付けたい場合は、整数が2の累乗であるかどうかを、2または奇数が残るまで再帰的に2で割ることによって決定する関数を作成する必要があります。これは非常に非効率的ですが、それでも本当にクールです。