使用let的方案中递归调用函数

时间:2019-09-18 17:50:04

标签: recursion scheme

在计划中是否可以执行以下操作?

(define (foo a b c d e)
  (let ((recurse (foo a b c (bar d) e))
    (if (= d e)
        #f
        (recurse))))

我有一个函数,该函数带有一组较长的参数和一些递归调用它的条件,并且它很难看,我希望可以简化它。

我已经尝试了几种不同的方法,但是我遇到了无限循环(我想让let急切地求值),或者我得到了糟糕的let形式错误。

2 个答案:

答案 0 :(得分:3)

您需要一个重击:

(define (foo a b c d e)
  (let ((recurse (lambda () (foo a b c (bar d) e))))
    (if (= d e)
        #f
        (recurse))))

然后,如果某些(但不是全部)参数更改,则允许您添加参数。

答案 1 :(得分:0)

由于大多数参数不变,因此您应该考虑使用命名的let

(define (foo a b c d e)
  (let recurse ((d d))
    (if (= d e)
        #f
        (recurse (cdr d)))))

这基本上与:

(define (foo a b c d e)
  (define (recurse d)
    (if (= d e)
        #f
        (recurse (cdr d))))
  // start recursion
  (recurse d))

所有其他变量将通过闭包提供。