簡體   English   中英

Haskell-嘗試創建一個函數來查找奇數階乘

[英]Haskell - Trying to create a function to find the factorial of odd numbers

fact :: Int -> Int 
fact n
    |n < 0 = 0
    |n == 0 = 1
    |n > 0 && n `mod` 2 == 1 = fact (n-1) * n
    |n > 0 && n `mod` 2 == 0 = n-1

當我輸入一個奇數時,例如:事實5將給出15,因為它應該1 * 3 * 5 = 15.但是我意識到如果我做事實7或任何其他奇數,它只乘以前兩個奇數。 我如何獲得將所有奇數相乘的函數,而不僅僅是第一個2。 事實上7 = 35(即3 * 5)。 另請注意,如果輸入偶數,它將計算出所有奇數的階乘,直到不包括偶數。

這讓我想起了Haskell程序員的着名演變 解釋終身教授的答案:

factorialOfOdds :: Integer -> Integer
factorialOfOdds n = product [1,3..n]

您的問題是,偶數的情況是n-1 ,這意味着當您得到奇數時,您實際上只是在做

n * (n - 1 - 1)

當你想要什么

n * n-2 * n-4 ......

所以試試吧

fact :: Integer -> Integer -- Overflows 
fact n
    |n < 0 = 0
    |n == 0 || n == 1 = 1
    |n `mod` 2 == 1 = fact (n-2) * n
    |n `mod` 2 == 0 = fact (n-1)

我也冒昧地刪除了一些冗余邏輯。 在這里,如果它是奇數,我們減2,所以5 - > 3.在偶數情況下,我們減1,最終得到一個奇數,然后遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM