4

私はプログラミングの初心者で、練習問題として 3 つの haskell 関数を python に変換するように求められました。1 つの出力が次の機能の入力として使用されるなど、3 つの機能は接続されています。

Haskell 関数が何をするかはわかりましたが、変換を開始する方法がわかりません!

これは Haskell コードです:

factorial :: Int -> Int
factorial n = product (down n)

product :: [Int] -> Int
product [] = 1
product (a:as) = a * product as

down :: Int -> [Int]
down 0 = []
down n = n : down (n-1)

そして、これは私の変換の試みでした:

class function:
    def down(self):
        if self.n == 0:
            self.lista = []
        else:
            self.lista = range(self.n, 0, -1)

    def product(self):
        for x in self.lista:
            if x == []:
                self.product = 1
            if x != []:
                for i in self.lista:
                    self.product = i * self.product

    def factorial(self):
        self.n = int(raw_input("n="))

        self.fact = self.product(self.down(self.n))

        print self.fact
        raw_input()

c = function()
c.factorial()

まず、これは Haskell コードの「直接変換」ではないと思います。それは大丈夫ですが、第二に、それはうまくいきません。

このプログラミングのバックグラウンドの欠如は私を殺しています...誰かがこの問題で私を助けてくれますか?

どうもありがとう!

編集:

この問題のポイントは、haskell を python に正確に変換することです。私は自分でそれを取り除いたバージョンを作りました。それは演習の次のステップでした ^^

4

2 に答える 2

7

まず、classラッパーを捨てます - それは必要ありません。

ストレートな Python 翻訳は次のようになります。

# factorial :: Int -> Int
def factorial(n):
    return product(down(n))

# product :: [Int] -> Int
def product(arr):
    if len(arr) == 0: return 1
    a, ar = arr[0], arr[1:]
    return a * product(ar)

# down :: Int -> [Int]
def down(n):
    if n == 0: return []
    return [n] + down(n - 1)

しかし、再帰的なスタイルはここではあまり Pythonic ではありません。次の演習: 再帰を反復、リスト内包表記、または呼び出しreduce(Python2 の場合) に置き換えます。

于 2012-11-01T17:58:29.197 に答える
4

慣用的なPythonを作成する場合は、再帰を避けてください。

down(n)と綴られrange(n, 0, -1)ます。xrangeHaskellの精神に近い怠惰なセマンティクスが必要な場合に使用します。

product(lst)ですreduce(operator.mul, lst, 1)。(ループを詳しく説明する方が慣用的ですが、これは短くなります。)

そこから、変換する方法が明らかになるはずfactorialです。

于 2012-11-01T17:53:42.603 に答える