具有多个参数的递归方法

时间:2015-05-29 02:05:34

标签: recursion parameters racket

我是Racket编程的新手,我想知道如何定义一个能够递归调用并且有三个参数(三个数字)的方法。 我知道如何定义函数和变量,但我很困惑这里主要是关于多个参数。

谢谢!

2 个答案:

答案 0 :(得分:0)

所有Racket(方案)函数都可以递归调用,但要工作,它们必须设计得恰当。这总是取决于你想要做什么,你没有提到。实际上,几乎不需要对三个数字进行递归。递归通常用于迭代由列表组成的数据结构。因此,更可能的情况是采用三个数字(或任何数量)列表的函数:

(define (sum lst)
  (if (null? lst) 0
    (+ (car lst) (sum (cdr lst)))))

(sum '(1 2 3))       => 6
(sum '())            => 0
(sum '(1 2 3 4 5 6)) => 21

一个更有效的实现使用一个辅助函数,它将运行总和传递给递归调用,允许尾调用 - 这不会增加堆栈。

(define (sum lst)
  (define (sum-helper lst sum)
    (if (null? lst) sum
      (sum-helper (cdr lst) (+ (car lst) sum))))
  (sum-helper lst 0))

你会注意到sum-helper有一个额外的参数,你已经问过了。如您所见,函数调用只是一个列表 - 只要您愿意(在合理范围内)。第一个符号是函数,其余是参数。

如果这还不够,请提供更多详细信息。

答案 1 :(得分:-1)

(define (takes-three-args a b c)
   (takes-three-args (* 2 c) (+ 1 b) (/ 1 a))) ;; Loops Forever and consumes
                                               ;; an ever-increasing amount of memory.