`

haskell - recursion

阅读更多

Haskell is such an language that you can leverage aided with recursion, you can solve a load of issues. 

 

we will going to examine some examples which can be solved by the recursion, problem such as 

  • maximum.
  • replicate,take,reverse,repeat,zip,elem
  • quick sort
  • Think recursively

Let's see the example code below. 

 

-- recursions.hs
--  we take a close look at the recursion 

maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x : xs) 
   | x > maxTail = x
   | otherwise  = maxTail 
   where maxTail = maximum' xs

-- a few more recursive functions 

-- a side note is that , guard will allow you to write condition, while 
-- pattern match do not allow condition 
replicate' :: (Num i, Ord i) => i -> a -> [a] -- i should be both a Num and a Ord 
replicate' n x 
  | n <= 0 = []
  | otherwise = x : replicate' (n - 1) x 


-- it does not mean that you cannot mix 
--  guard and pattern matching!
take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _ 
  | n <= 0 = [] -- without the otherwise, the guard will fall through to pattern match
take' _ [] = []
take' n (x :xs) = x : take' (n - 1) xs



-- reverse

reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x : xs) = reverse' xs ++ [x]

-- infinite list?
--  repeat'
repeat' :: a -> [a]
repeat' x = x : repeat' x


-- zip'
-- take two lists and zips them together. zip [1,2,3] [2,3]

zip' :: [a] -> [b] -> [(a, b)]
zip' _ [] = []
zip' [] _ = []
zip' (x : xs) (y : ys) = (x, y): zip' xs ys

-- elem'
-- tell if an element exists on a list
elem' :: (Eq a) => a -> [a] -> Bool
elem' a [] = False
elem' a (x:xs)
  | a == x = True
  | otherwise = a `elem'` xs


-- quicksort
-- an quick sort implemnentation with recursion

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x :xs) =
  let smallerSorted = quicksort [a | a <- xs, a <= x]
      biggerSorted = quicksort [a | a <- xs, a > x]
  in smallerSorted ++ [x] ++ biggerSorted

-- here is guideline on the quick sort, which we called is the quick sort mentality 
--   We did quite a bit of recursion so far and as you've probably noticed, there's a pattern here. Usually you define an edge case and then you define a function that does something between some element and the function applied to the rest. It doesn't matter if it's a list, a tree or any other data structure. A sum is the first element of a list plus the sum of the rest of the list. A product of a list is the first element of the list times the product of the rest of the list. The length of a list is one plus the length of the tail of the list. Ekcetera, ekcetera ...

 

分享到:
评论

相关推荐

    Haskell-frex

    这个库的名称"frex"可能是"free recursion"(自由递归)或"functional recursion"(函数式递归)的缩写,暗示了它在处理递归和模式匹配时的独特特性。 在Haskell中,模式匹配是一种强大的编程工具,它允许我们将...

    left-recursion:在Haskell解析器中消除左递归的快速说明

    在Haskell这样的函数式编程语言中,构建解析器时,理解并消除左递归是至关重要的,因为左递归可能导致无限递归,从而消耗大量计算资源,甚至引发程序崩溃。 左递归发生在文法的非终结符可以直接或间接地在其自身的...

    haskell趣学指南

    【Haskell趣学指南】 Haskell是一种纯函数式编程语言,以其优雅的语法、静态类型系统和强大的类型推导机制而闻名。它鼓励编写不可变数据和无副作用的代码,从而提高了程序的可读性和可维护性。让我们通过以下几个...

    haskell最短路-自己实现fold代替递归

    Paul的第二次作业,Use higher-order functions such as map and fold (or adaptations thereof for relevant structures) rather than explicit recursion.也就是用自己针对Pathtree进行fold定义,然后利用fold来替换...

    recursion-schemes-源码.rar

    《递归模式(recursion schemes)详解》 在编程领域,递归不仅仅是一种解决问题的方法,它更是一种强大的抽象工具。递归模式,或者称为递归方案(recursion schemes),是函数式编程中的一种高级技术,用于处理数据结构...

    The Haskell Road to Logic, Maths and Programming

    - **归纳法(induction)**与递归(recursion): - 数学归纳法的基本原理。 - 递归定义与递归算法。 - **组合数学(combinatorics)**: - 组合问题的解决方法。 - 使用多项式求解递归关系。 - **核心递归...

    Functional_Programming:练习以学习函数式编程

    - Recursion - Currying - Partial Application - Lambdas 我将尽力解决这些问题。 尽管此处的大多数示例都将使用javascript进行简化和广泛采用,但我还将在其中提供一些示例 长生不老药 Python 榆树 Java脚本 我...

    induction, recursion and programming

    - **函数式语言**:这类语言更侧重于描述计算的本质,而不是具体的操作顺序,如Lisp、Haskell等。 - **逻辑编程语言**:这类语言基于形式逻辑,通过逻辑表达式来描述问题,如Prolog。 #### 五、案例研究与应用 为了...

    haskell_practice:Haskell中的学习练习

    10. **Recursion**:在Haskell中,递归是解决许多问题的常见手段,因为它是纯函数式语言的基础。 通过"Haskell_practice"项目,学习者可以实践这些概念,例如编写递归函数、使用高阶函数处理列表、理解Monads的工作...

    recursion-algorithms:使用递归方案编写的各种算法的集合

    这个"recursion-algorithms"资源可能包含上述或其他递归算法的Haskell实现,提供了一个学习和实践递归的好平台。通过研究这些示例,开发者可以更深入地理解递归的工作原理以及如何在实际问题中应用它。 由于没有...

    yaya:Haskell中的另一个递归方案库

    "yaya"库就是为Haskell设计的一个递归方案库,它的全称可能为Yet Another Yet Another Recursion Schemes,暗示它是众多递归方案库中的又一选择。 递归方案的核心思想是将递归分解为可组合的构建块,如catamorphism...

    Project-Euler-solutions:可运行代码,用于解决Java,Python,Mathematica,Haskell中的Project Euler问题

    一些解决方案还具有Mathematica和Haskell程序。 一些解决方案程序在注释中包含详细的数学解释/证明,以证明代码的逻辑合理性。 从#1到#100的所有问题都有Java和Python程序,从#1到#50的问题有Mathematica程序...

    ECM2418_HaskellCW:针对ECM2418计算机语言和表示形式的Haskell课程的解决方案

    7. Recursion(递归):在Haskell中,递归是解决许多问题的主要手段。理解如何定义正确的基例和如何构造递归案例是必要的。 8. Type Classes(类型类):类型类提供了一种多态性实现方式,类似于其他语言的接口或...

    Recursion_and_Backtracking

    当函数调用自身时,其称为recursion 强大的iterations替代。( for loop ) 非常适合解决某些类型的问题。 导致优雅和简单的短代码。 函数式编程( Haskell )仅使用递归。 发生在代码和现实世界的许多地方: ...

    recursion-schemes:通用香蕉,镜片和铁丝网

    递归方案 该程序包将常见的递归模式表示为高阶函数。一个熟悉的例子这是两个递归函数。 sum :: [ Int ] -&gt; Intsum [] = 0sum (x : xs) = x + sum xsproduct :: [ Int ] -&gt; Intproduct [] = 1product (x : xs) = x * ...

    advent2018:Code 2018解决方案的到来

    8. **Recursion**:在Haskell中,递归是解决许多问题的基础,学习如何正确地使用和终止递归。 9. **Test-Driven Development (TDD)**:如何编写测试并确保代码质量,使用Haskell的测试框架如`HUnit`或`QuickCheck`。...

Global site tag (gtag.js) - Google Analytics