读者要小心:对函数式编程一无所知,对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。
答案 0 :(得分:1)
注意:vendor.css
和b-1
是变量的名称。如果您想要减法,请使用a-1
。我会在答案中使用(- a 1)
,但如果它确实是变量,则可以替换它。
无限制地执行此特定逻辑的显而易见的方法是:
(- a 1)
标准的Scheme方法是使用;; 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
我想你应该能够从这里弄明白。