问题标签 [recursion-schemes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
182 浏览

functional-programming - 不使用反向返回列表中最后一个元素的非尾递归函数?

我试图让一个非尾递归函数返回列表的最后一个元素,而不使用任何类型的反向、映射、迭代、突变(内置或用户构建)。到目前为止,我已经成功地制作了一个尾递归版本和一个使用反向函数的非尾版本。但我只是想不出如何制作一个非尾递归函数。

我真的很感谢你的帮助!

0 投票
3 回答
244 浏览

haskell - 在 Haskell 中使用递归方案解决变更问题

我试图从这个关于递归方案的博客中理解组织同态。当我运行示例以解决博客中提到的变更问题时,我遇到了一个问题。

找零问题采用货币的面额,并试图找到创建给定金额所需的最小硬币数量。下面的代码取自博客,应该计算答案。

现在,如果你评估change 10它会给你 3。

这是...不正确的,因为您可以使用 1 枚价值 10 的硬币赚取 10。

所以我认为也许它正在解决硬币找零问题,它找到了你可以赚给定金额的最大方式。例如,您可以用{ 1, 1, ... 10 times }, { 1, 1, 1, 1, 5}, { 5, 5 }, 4 种方式制作 10 { 10 }

那么这段代码有什么问题呢?解决问题的问题在哪里?

TLDR

此博客中关于递归方案的上述代码没有找到改变一笔钱的最小或最大方法。为什么它不起作用?

0 投票
2 回答
132 浏览

haskell - 这是递归方案中的某种态射吗?

我最初是通过以下方式实现欧几里得算法的。

该算法是尾递归的,我希望它可以用recursion-schemes直观地编写。然后,下面的euc是递归部分的摘录。这个euclid函数使用euc,而psi专门用于一步处理。

euc函数看起来像apo态射,但我不知道如何将apo专门化为euc。在我看来,它们是完全不同的东西。是否可以将euc写成递归方案中的某种态射?

问候。

0 投票
1 回答
143 浏览

haskell - 这个“硬币找零”问题的 hylo 解决方案是如何设计的?

我在寻找hylomorhism示例时遇到了@amalloy 关于 SO 的一篇不错的帖子,它通过有用的讨论和完整的实现来说明递归方案 (RS) 的使用:

该代码按预期工作。尽管已经对 RS 方面有了一些模糊的直觉,但我仍然想知道:

  1. 因为这是关于计算组合,为什么Solved Cent而不是Solved Int?(如果这是一个合理的问题,这可能听起来像一个小问题,但我希望它可能是下面其余不确定性的根源,尽管我怀疑我错过了一些更基本的东西!)。
  2. 因为我们稍后在 中求和,所以divide0/1Solved大概表示失败/成功?
  3. 在 中,添加和是conquer什么意思?这两个值(作为s)表示什么,在这种情况下它们的总和意味着什么?abPendingCent
  4. 在 中conquer,我原以为我们只需要对Solveds 求和,作者就谈到了这一点,但目前尚不清楚这个Pending案例是如何起作用的(例如,修复conquer (Pending a b) = 11 确实对功能产生不利影响,这可能是一个线索waysToMakeChange返回,11或该情况固定为的任何常数)。
  5. in conquer, aand bare Cents, 而 in dividetheyre ChangePuzzleArgs(aka ([Cent], Cent)) - 转换发生在哪里?

注意:作为新手,我无法在原始答案下方发表评论,这可能更合适,但我希望这也是有用的。

0 投票
1 回答
87 浏览

haskell - 如何使用递归方案来“cata”两种相互递归的类型?

对于带有标记节点的叶值树,我从这种类型开始:

我想在这棵树上写一些折叠,它们都采用变态的形式,所以让我们recursion-schemes为我做递归遍历:

一切都很好:我们可以遍历一棵树:

但是 Tree 的定义有点笨拙:每个数据构造函数都需要单独处理 Label。对于像 Tree 这样的小型结构来说,这并不算太糟糕,但是如果有更多的构造函数,那就太麻烦了。所以让我们让标签成为它自己的层:

太好了,现在我们的 Node 类型代表了没有标签的树的结构,Tree' 和 Labeled 一起用标签来装饰它。但我不再知道如何使用cata这些类型,即使它们与原始Tree类型同构。makeBaseFunctor没有看到任何递归,所以它只定义了与原始类型相同的基本函子:

就像,公平地说,我也不知道我希望它生成什么:cata期望一个单一的类型进行模式匹配,当然它不能合成一个是我的两种类型的组合。

那么这里的计划是什么?cata如果我定义自己的 Functor 实例,这里是否有一些适应?或者定义这种类型的更好方法,避免重复处理 Label 但仍然是自递归而不是相互递归?

我认为这个问题可能与具有多种类型的递归方案有关,但我不明白那里的答案:Cofree到目前为止对我来说很神秘,我无法判断它是问题的本质还是只是表示的一部分用过的; 并且该问题中的类型不是相互递归的,所以我不知道如何将解决方案应用于我的类型。

0 投票
2 回答
106 浏览

haskell - `refold :: Functor s => (a -> sa, a) -> (sb -> b) -> b` 作为通用类型之间的态射

各种递归方案归结为特定的实例化refold

什么是有意义的解释refold

数据类型data Nu f = forall a. Nu (a -> f a) aandnewtype Mu f = Mu {unMu :: forall b. (f b -> b) -> b}可以看作是余代数和代数中忘记函子的 colimit 和 limit,并且refold是它们之间的态射,但它是否阐明了refold

0 投票
0 回答
78 浏览

haskell - 用组织态实现加泰罗尼亚数的显着开销

我最近正在探索递归方案,并希望找到一些组织同构的用例——我认为加泰罗尼亚数字可能是一个有趣的用例(我知道有更好的方法来实现加泰罗尼亚数字,这不是重点问题)。我想出的是以下内容:

然而,性能会受到影响catalanHisto

与以下相比,这非常糟糕catalanMemo

鉴于至少它终止了,该histo版本肯定记住了一些东西,但是我不确定我是否在滥用巨大的开销histo,或者这只是以这种方式编写程序的代价。当我继续进行一些基本的分析时:

不是解释这些结果的专家,我猜除了 中的一些分配之外Control.Comonad.Cofree,它花费大部分时间在 的非平凡分支中进行分配catalanHisto,可能是由于toListand reverse,我不确定有多少优化空间.