阅读器要当心:关于功能编程的无知,甚至更无知。
我在方案中具有递归功能。在非基本案例部分中,该函数将自己调用两次,并比较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-1
和 a-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)
我想您应该能够从这里弄清楚。