0

数nを取り、その数の無限リストをすべての数の累乗に返す関数「累乗」を作成する必要があります。

powers 2 = 2,4,8,16,32......

言語の非常に特定のサブセットを使用してこれを行う必要があります。ここで使用できる組み込み関数は、div、mod、even、odd、head、tail、not、null、length、reverse、elem、map、filter、foldr、sumです。 、product、take、drop、takewhile、dropWhile、zipWithおよびfrom。

サブセットにも^演算子はありません。

さらに重要な制約がいくつかあります。

  • コードは80文字を超える1行を超えてはなりません
  • 「ヘルパー関数」は許可されていません。つまり、この定義内で使用する別の関数を作成することはできません。

これまでのところ、私の考えはこれらの線に沿っています:

powers = \n -> map (\x -> "some function to get n to the power of x") (from 1)

しかし、ヘルパー関数なしでこれを実行する関数を取得する方法を理解できません。

たとえば、数値xの無限リストを返す関数inflistを使用する場合は、次のようにすることができます。

powers = \n -> map (\x -> product(take x (inflist n))) (from 1)

でも、その機能が使えなかったので、こんなことはできません。

表記が通常のhaskellと異なる場合は申し訳ありませんが、この表記を使用する非常に厳密なコアhaskellサブセットです。

4

2 に答える 2

3

これは再帰の質問です。

powers n = n : map (* n) (powers n)

(使用は許可されています:か?)

于 2012-11-21T07:42:55.923 に答える
0

洞察が来たとき、これは楽しくて楽しいものでした。次のリストで2の長い繰り返しを連続して生成します

[ [ 2 | y <- [1..x]] | x <- [1..]]

次に、各リストの製品を取得します。

map product [ [ 2 | y <- [1..x]] | x <- [1..]]

リストを制限するためにmodと複数のmod関数で苦労した呼び出しの前に、必ずtakexを使用してください。

反復が許可された場合。

take 24 $ iterate (2*) 2

リストを生成します。

2018年4月4日編集

無限再帰関数は、関数を埋めるために探しているものかもしれません。それは可能性があります:

pow l = l ++ pow [(last l * 2)]

リストを作成するには、リストを組み立てる必要があり、リストの最後の要素を使用して次の要素を順番に計算する必要があります。これもtakeで実行する必要があります。また、次のコマンドはリストを1で開始します。64や63などの任意の数値で開始できます。最後の値をパラメーターとして渡そうとしましたが、関数はリストを生成しませんでした。選択肢があります。「++」の代わりに「:」を使用しますが、リスト内の各要素が生成されます。'take'の前に'concat$'を使用してリストをクリーンアップする代わりに、値のリストを生成します。

take 10 $ pow [1]
于 2018-04-01T02:48:38.010 に答える