【问题标题】:out-mode parameters in scheme recursive function方案递归函数中的外模式参数
【发布时间】:2017-12-02 05:15:37
【问题描述】:

读者注意:对函数式编程一无所知,对 Scheme 更是一无所知。

我在 Scheme 中有一个递归函数。在非基本情况部分,函数调用自身两次,在 if 语句中比较两次调用。我需要返回更大的结果。所以...我目前正在做的是:

(if (> (recursive-call a b-1) (recursive-call a-1 b))
    (recursive-call a b-1)
    (recursive-call a-1 b))

这显然需要我进行 3 次递归调用而不是 2 次。

有没有办法从 if 语句中引用递归调用的值?我不允许定义额外的函数或使用 let。我认为它与 out-mode 参数有关,但不知道如何使用、分配或访问 out-mode 参数的值。当我问教授时,我被指出函数式语言中的参数传递方法以及函数返回的一般过程。至少没有帮助。我不能发布完整的代码,因为它是一个班级的作业。这是否足以让有人指出我正确的方向?

注意:我们允许的唯一构造是 null?、car、cdr、else、lcm、+、>、if、递归函数的参数(只能是列表和数字)、整数文字和插入语。不幸的是,没有使用 max、define 或 let。

【问题讨论】:

  • 使用内置的max 过程,您可以使用(max (recursive-call a b-1) (recursive-call a-1 b)) 而不是使用if 语句。或者,您可以定义其值为递归调用的变量,然后您可以使用已有的设置在 if 语句中比较这些变量:(if (> a b) a b),其中 a 是第一个递归调用 (define a (recursive-call a b-1)),b 是另一个。
  • 如果您被允许lambda,请记住(let ((x e)) b) ((lambda (x) b) e)
  • 再一次,没有 lambda,没有让。只有 null?、car、cdr、else、lcm、+、>、if、递归函数的参数、整数文字和括号。
  • 请不要这样破坏你的帖子。

标签: recursion scheme parameter-passing


【解决方案1】:

注意:b-1a-1 是变量的名称。如果你想要减法,你会使用(- a 1)。我将在我的回答中使用(- a 1),但如果它真的是一个变量,你可以替换它。

不受限制地执行此特定逻辑的明显方法是:

;; return the largest of the two
(max (recursive-call a (- b 1)) 
     (recursive-call (- a 1) b))

标准的 Scheme 方法是使用 let 在变量中绑定您多次使用的值,这样您就不会做超出您需要的计算:

;; cache computed values in local bindings
(let ((a (recursive-call a (- b 1)))
      (b (recursive-call (- a 1) b)))
  (if (> a b) a b))

由于您被限制不使用其中任何一个,您可以将let 版本重写为其原始形式。 let 可以这样重写:

(let ((ba va) (bb vb))
  ...)

; ===
((lambda (ba bb)
   ...)
 va
 vb)

我想你应该可以从这里弄清楚。

【讨论】:

  • 已删除评论。
  • @MichelleWilliamson 如果没有lambdadefine,你应该如何创建一个函数?这就像一场让所有有腿的人都失去资格的跑步比赛。
  • define 和 lambda 用于创建递归函数。我们不允许再次使用它们,也不允许修改给定的函数定义。我们唯一可以做的就是在 cond 中添加东西。而我们被允许在条件中添加的东西只能包含给定的构造。
  • @MichelleWilliamson 在这种情况下,它要么可以通过冗余调用,要么您遇到 XY 问题,您选择的解决方案是让您卡住的原因,并且可以在这些限制内轻松解决最初的问题。也许如果我们知道您的实际问题并看到您目前的情况,我们可能会为您指明不同的方向。
  • 谢谢@sylwester。不幸的是,我不能再发帖了。我已经觉得我正处于如果我再发帖教授可能会提出问题的那条线上。不过,我确实再次收到了教授的回复,我的解决方案是正确的。他昨天的回复让我大吃一惊,认为必须有一个更优化的解决方案,而我只是没有这门语言的知识和经验。
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多