我是Racket编程的新手,我想知道如何定义一个能够递归调用并且有三个参数(三个数字)的方法。 我知道如何定义函数和变量,但我很困惑这里主要是关于多个参数。
谢谢!
答案 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.