首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#lang plai拍子乘数函数

#lang plai拍子乘数函数
EN

Stack Overflow用户
提问于 2015-02-04 18:28:52
回答 1查看 228关注 0票数 0

我正在做一个项目,让我们习惯于在编程语言课程中使用简单类型的语言。我被一个真正困扰着我的问题卡住了(完成了所有其他的问题,没有问题)。我们将采用以下数据类型定义:

代码语言:javascript
复制
(define-type Tree
[leaf (val number?)]
[node (val number?)
(left Tree?)
(right Tree? ) ] ) 

然后“实现函数'scaled',它接受一棵树,并返回一个具有相同形状的树,但是所有的值都乘以给定的比例。

示例:(scaled (node -5 (叶6) (叶-7)) 2)应生成(节点-10 (叶12) (叶-14))“

所以基本上我只需要将所有这些值乘以一个给定值,在这个例子中是2。

以下是我在尝试了不同的方法后得到的结果:

代码语言:javascript
复制
(define (scaled [ t Tree?] [n  number?] )  
(type-case Tree t  
[leaf (val) val] 
[node (val left right) ( * val (scaled left) (scaled right)  n  ) ] ) )    

我基于我之前为任务的其他部分创建的代码,我得到了正确的结果。问题是,它用420的解决方案“成功地”将所有数字和结果相乘,而不是将每个值分别相乘。我知道这与我的“n”位置有关,但我尝试了这么多不同的方法,但都没有成功。如果任何人有任何有用的提示/提示/解决方案,将不胜感激。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-02-05 01:51:13

思考这个问题的方法不是向下到更低的实现级别,而是上升到我们可以思考scaled是什么的级别。问题不在于找不到把n放在哪里。它正在弄清楚scaled应该做什么。

无论它做什么,它都需要返回一棵树。

代码语言:javascript
复制
; DefType F1 : Any -> Tree
(define (f1 x)
  (leaf 42))

下一个最重要的事情是它需要接受一棵树作为输入。

代码语言:javascript
复制
; DefType F2 : Tree -> Tree
(define (f2 [t Tree?])
  (leaf 42))

输入和输出之间存在同构关系,接下来必须解决这一问题。输出树的结构需要与输入树的结构相匹配。

代码语言:javascript
复制
; DefType F3 : Tree -> Tree
(define (f3 [t Tree?])
  t)

这得到了我们想要的东西,但从函数式编程的角度来看,这是以牺牲质量为代价的,因为f3返回的是对输入的引用,而不是从输入派生的值。函数需要返回一个与输入值具有相同结构的新输出值。要复制该结构,该函数在传递node时必须返回node,传递leaf时必须返回leaf

代码语言:javascript
复制
; DefType F4 : Tree -> Tree
(define (f4 [t Tree?])
  (type-case Tree t
    [leaf (val) (leaf val)]
    [node (val left right)
       (node val (f4 left)(f4 right))]))

现在已经对类型进行了排序,是时候将输入树转换为输出树了。这需要上一级而不是下一级。可以从重写f4开始。

代码语言:javascript
复制
; DefType F5 : Tree -> Tree
(define (f5 [t Tree?])
  (type-case Tree t
    [leaf (val) (leaf (id val))]
    [node (val left right)
      (node (id val) (f5 left)(f5 right))]))

很重要,但不是很有趣。用任意函数替换id似乎更有趣。如此有趣,可能值得添加第二个参数。

代码语言:javascript
复制
; DefType N2N : Number -> Number
; DefType F6 : Tree (Number -> Number) -> Tree
(define (f6 [t Tree?] [n2n N2N?])
  (type-case Tree t
    [leaf (val) (leaf (n2n val))]
    [node (val left right)
      (node (n2n val) (f6 left) (f6 right))]))

函数scaled

代码语言:javascript
复制
; DefType Scaled : Tree Number -> Tree
(let ((f lambda(x y)(* x y)))
  (define (scaled [t Tree?][n Number?])
    (type-case Tree t
      [leaf (val)(leaf (f n val))]
      [node (val left right)
        (node (f n val) (scaled left)(scaled right))])))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28319037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档