计算产品递归只用加法

我不知道为什么计算产品下面的Haskell源代码递归只能用另外不起作用。

mult ab = a + mult a (b-1)

我总是得到一个堆栈溢出错误。

--------------解决方案-------------

你必须指定一个终止条件,否则递归将运行无限。

mult a 0 = 0
mult ab = a + mult a (b-1)

如果发生什么b0

你总是可以尝试更多的原创,哈斯克尔十岁上下的解决方案= P

mult ab = sum $ take b $ repeat a

与任何递归函数,应该有至少2例。

基部壳体和递归情况。

为了让其更加明确,使用的情况下(如我上面提到的情况下)语句是很好的,易于理解的。

mult ab = case b of
0 -> 0 -- the base case, multiply by 0 = 0
_ -> a + mult a (b-1) -- recursive addition case (_ matches anything
-- but 0 is already covered)

分类:哈斯克尔 时间:2012-01-01 人气:0
本文关键词: 哈斯克尔,递归
分享到:

相关文章

  • 哈斯克尔 - 递归下降解析器 2013-10-15

    可有一个人推荐在哈斯克尔递归下降解析器的一个简单的工作示例(代码)? 所有我查到的资料太难理解. 谢谢! --------------解决方案------------- 有一个在"真实世界哈斯克尔"专门一章Parsec ,随附哈斯克尔平台递归下降解析器组合库. 还有一堆Parsec的哈斯克尔维基链接. 最后,一​​旦你熟悉的例子,你需要的参考指南. 虽然不是特别简单,罗伯特Giegerich对他的演讲"Programmierspra​​chen UND IHREÜberset

  • 哈斯克尔递归列表理解导致C堆栈溢出 2013-01-27

    所以我做素数的名单,以帮助我学习用简单的审判庭哈斯克尔(没有华而不实的东西,直到我的语言更好). 我试图使用下面的代码: primes = 2 : [ x | x <- [3..], all (\p -> (mod xp) /= 0) primes] 此加载没有发生错误. 然而: >take 2 primes [2ERROR - C stack overflow 我试着用嵌套的列表推导同样的事情. 它不工作. 我猜想,我做了太多的递归调用,但如果我只计算一个黄金这不应该是这样的. 在我的

  • 哈斯克尔递归和类型错误 2013-02-23

    我教自己Haskell和学习任何编程语言是使用它的最佳方式. 我现在的"锻炼"是取的一个实现. 伪代码是: take(0, list) = [] --empty list take(n, list) = const(head(list), take(n-1, tail(list)) 我一直在Haskell摸索出的是: myTake :: (Num a) => a -> [b] -> [b] myTake 0 l = [] myTake n (l:ls) = l : m

  • 哈斯克尔递归地图功能 2014-12-15

    为什么这个抛出一个错误? myTest :: Int -> [Int] myTest a | a == 0 = [] | otherwise = x ++ map(myTest) x where x = [a-1] 我希望,这将使从去列表1.相反,我得到的错误: couldn't match the expected type 'Int' against inferred type '[Int]' in the first argument of 'map', namely '(myTest)'

  • 哈斯克尔递归/圆形模块定义? 2013-09-15

    我有进口对方两个模块. Haskell没有支持递归模块. 所以,我怎么可以重写我的数据类型而不需要循环的模块系统. 这里是我的Character.hs module Character where import ItemSystem data Character = Character { name :: String, items :: [Item] } 一个在这里ItemSystem.hs module Item where import Character data ItemEffect

  • 哈斯克尔递归问题,微小的解析器。 一些东西 2014-06-20

    data Expr = Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr deriving(Eq, Show) 这是数据类型为Expr ,我有几个问题. 我想解析般的表情*(Expr,Expr)如图所示的数据类型定义. 不过,我确实有一些问题,"创造"一个有效的Expr . 我使用模式匹配识别不同的东西expr可以是. 一些更多的代码: parseExpr :: St

  • 哈斯克尔递归问题,微小的解析器。 expr的否定,让表情 2015-02-09

    data Expr = Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr deriving(Eq, Show) parseExpr :: String -> (Expr, String) parseExpr ('*':'(':s) = (Mult xy, s'') where (x,',':s') = parseExpr s (y,')':s'') = parseExpr s'

  • 具有递归的麻烦和键入错配哈斯克尔 2012-03-21

    -- genrep genrep :: a -> Int -> [a] genrep an | n == 0 = [] |otherwise = a ++ genrep (a (n-1)) 所以我试图在哈斯克尔简单的复制功能 - 一个将采取通用的类型和复制了N次. 然而,上述似乎不工作. 我不断收到此错误代码: *** Expression : a ++ genrep (a (n - 1)) *** Term : genrep (a (n - 1)) *** Type : Int ->

  • Y组合,无限的种类和匿名递归哈斯克尔 2013-03-19

    我试图解决的最大子序列和问题,并用NEATO解决方案上来 msss :: (Ord a, Num a) => [a] -> a msss = f 0 0 f gmax _ [] = gmax f gmax lmax (x:xs) = let g = max (lmax + x) in f (g gmax) (g 0) xs 您调用包装函数msss ,然后调用f ,从而实际上做的工作. 该解决方案是好的,据我所知正常工作. 如果由于某种原因,我不得不解决生产代码的最大一笔子的问题,这是我会怎么做

  • 为什么不哈斯克尔类型同义词允许递归? 2013-09-04

    任何人都可以解释为什么这些都高高兴兴地编译: data A ab = A { a :: a, b :: b } newtype B a = B (A a (B a)) newtype C = C (A Int C) 但我不能创建通过类型同义词一个类似的递归定义的类型? type B a = A a (B a) type C = A Int C 虽然很明显data B a = A { a :: a, b :: B a }工作得很好. 有什么办法避免处理额外的构造点¯x无论我想要的类型递归? 我主要

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.433 (s). 10 q(s)