方案递归函数中的out-mode参数

时间:2017-12-02 05:15:38

标签: recursion scheme parameter-passing

读者要小心:对函数式编程一无所知,对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。

1 个答案:

答案 0 :(得分:1)

注意:vendor.cssb-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

我想你应该能够从这里弄明白。

相关问题