方案递归函数中的户外参数



阅读器要当心:关于功能编程的无知,甚至更无知。

我在方案中具有递归功能。在非基本案例部分中,该函数将自己调用两次,并比较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语句中引用递归调用的值?我不允许定义其他功能或使用让。我认为这与户外参数有关,但不知道如何使用,分配或访问外模式参数的值。当我问教授时,我指出了功能语言的参数传递方法以及函数返回的一般过程。至少没有帮助。我无法发布完整的代码,因为这是一堂课的作业。这足以让某人指向正确的方向吗?

注意:我们唯一允许的构造是null?,CAR,CDR,else,LCM, ,>,如果是递归函数的参数(必须仅是列表和数字),整数文字和插入语。不幸的是,不使用Max,定义或LET。

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

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

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

标准方案的方法是使用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 ((ba va) (bb vb))
  ...)
; ===
((lambda (ba bb)
   ...)
 va
 vb)

我想您应该能够从这里弄清楚。

最新更新