【问题标题】:Function Recursion within itself - haskell自身内部的函数递归 - haskell
【发布时间】:2017-03-28 00:30:49
【问题描述】:

我试图将一个函数递归地传递给它自己给定的次数。所以给定函数形式的输入|重复次数(计数) |争论。举个例子,如果给定输入:f 3 2 它将返回 f(f(f 2) 如果函数值“平方”它会将参数平方。

就逻辑而言,我是这样处理的:

def repeatnew func count arg
    if count == 1 then (func arg)
    else (func (repeatnew func (count -1) arg))

一段时间以来,我一直在尝试研究解决方案,并且遇到了使用 Iterate 和其他一些功能。最后我遇到了这个:https://wiki.haskell.org/Higher_order_function 但是我无法实现一个可行的解决方案。

编辑:我尝试实现的解决方案可以正确编译,但我对 haskell 仍然非常缺乏经验,希望能解释一下如何使用我的参数创建高阶函数。

【问题讨论】:

  • I was unable to implement a working solution 阻止您的解决方案工作的具体问题是什么?您尝试了哪些实际代码?
  • 只是我试过的例子:fpow f n x = iterate f x !! nrepeatFun :: Char -> Int -> Char -> String repeatFun func count arg repeatFun = (count-1)*((func)+(arg)) repeatFun = func (repeatFun func (count-1) arg)我是haskell的新手,所以我的实施技能严重缺乏
  • 您的帖子目前缺少一个问题,这对于问答网站至关重要。请edit您的帖子。如果您遇到任何问题,请添加“错误”代码和您收到的任何错误消息,或者,如果行为不符合您的预期,请添加预期和实际行为。
  • 感谢您修复布局,关于一个问题,使用我提到的链接如何在给定我的特定输入的情况下实现更高阶函数。我应该能够将次数传递给循环,将参数传递给也作为输入参数的函数,但我很难将其转换为实际的haskell代码。我在之前的评论中尝试过的解决方案甚至无法编译,不幸的是,我对 haskell 的有限知识并不能帮助我找到解决方案。
  • “我尝试实现的解决方案可以正确编译,但我对 haskell 仍然非常缺乏经验,希望能解释一下如何使用我的参数创建高阶函数。” 这听起来像是您希望审查您的解决方案。如需评论,请前往Code Review

标签: loops haskell


【解决方案1】:

从@Antisthenes 的评论中分离出来,另一种方法是使用foldl1 没有基本情况。

pipeNTimes :: (a -> a) -> Int -> (a -> a)
pipeNTimes f n = foldl1 (.) $ replicate n f

pipeNTimes (*2) 3 2 -- returns 16

【讨论】:

  • +1 来自我,因为这是一种比我的努力更实用的方法,我从中学到了很多东西!
【解决方案2】:

诚然,我只是 Haskell 的初学者,所以这可能是一个幼稚的实现,但我认为这可以满足您的需求:

applyRecursively f x y
    | x == 1 = f y
    | otherwise = f (applyRecursively f (x-1) y)

applyRecursively 函数接受一个函数和两个数字作为参数。

如果中间参数(count)为 1,那么我们将参数函数应用于参数 y。这是停止递归的边缘情况。

otherwise 保护子句然后递归调用 x 参数递减,并将函数 f 应用于结果。

我已经使用这样的 lambda 对其进行了测试:

applyRecursively (\x -> x + 1) 3 3

它应该将 3 的值加 1 三次 - 它返回一个值 6,所以看起来它可以工作。

正如我所说,我是一个初学者,但我认为这可以满足您的需求。

【讨论】:

  • 也可以用简单的 if 代替守卫来实现。对于更多功能的方法和codegolf,它也可以定义为:applyRecursively f n arg = foldr (.) id (replicate n f) $ arg对于更多的codegolfing,还有免费版本:applyRecursively = (foldr (.) id .). flip replicate
  • @Antisthenes 我想我的心都融化了!有时,当我尝试遵循函数式编程时,它似乎仍然很神奇,但是非常感谢您的代码,这真的很有帮助。
  • @Antisthenes:applyRecursively f n arg = iterate f arg !! n 怎么样?
  • @yatima2975:是的,这也是个好主意。从一开始我就在考虑写无点,这就是我这样写的原因。
猜你喜欢
  • 2015-05-09
  • 2011-02-14
  • 2019-02-28
  • 2021-07-19
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多