计划可变函数以添加数字
Scheme variadic function to add numbers
我有这个代码
(define mysum
(lambda (l)
(if (null? l)
0
(+ (car l) (mysum (cdr l))))))
哪个有效:
(mysum '(1 2 3))
给出 6,但是这个
(define (my+func . numbers)
(lambda (num)
(if (null? num)
0
(+ (car num) (my+func (cdr num))))) numbers)
不工作。毫无疑问,我在尝试在 lambda 中进行递归时迷路了。有什么想法吗?
所以有两种方法可以制作程序。你有这个:
(define name (lambda (arg ...) body ...))
还有等价的语法糖:
(define (name arg ...) body ...))
如果你愿意,你可以用你最后的程序做相反的过程:
(define my+func
(lambda numbers
(lambda (num)
(if (null? num)
0
(+ (car num) (my+func (cdr num)))))
numbers))
当您执行 (my+func 1 2 3)
时,它会创建一个接受一个参数的过程。由于该过程不是最后一个表达式,因此它被丢弃并丢弃,最后一个表达式是 numbers
。因此你会得到 (1 2 3)
作为结果。
这可行:
(define my+func
(lambda numbers
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers))))))
可以翻译回加糖的define
:
(define (my+func . numbers)
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers)))))
注意 apply
。这是因为您不能将 (my+func '(2 3))
作为递归发送,但它必须是 (my+func 2 3)
,这就是 apply
所做的。或者,您可以制作一个使用列表的助手:
(define (my+func . numbers)
(define (helper ns)
(if (null? ns)
0
(+ (car ns) (helper (cdr ns)))))
(helper numbers))
通常人们会为助手中的数字选择相同的名称,但我记得我对不相同的阴影变量感到困惑。
我有这个代码
(define mysum
(lambda (l)
(if (null? l)
0
(+ (car l) (mysum (cdr l))))))
哪个有效:
(mysum '(1 2 3))
给出 6,但是这个
(define (my+func . numbers)
(lambda (num)
(if (null? num)
0
(+ (car num) (my+func (cdr num))))) numbers)
不工作。毫无疑问,我在尝试在 lambda 中进行递归时迷路了。有什么想法吗?
所以有两种方法可以制作程序。你有这个:
(define name (lambda (arg ...) body ...))
还有等价的语法糖:
(define (name arg ...) body ...))
如果你愿意,你可以用你最后的程序做相反的过程:
(define my+func
(lambda numbers
(lambda (num)
(if (null? num)
0
(+ (car num) (my+func (cdr num)))))
numbers))
当您执行 (my+func 1 2 3)
时,它会创建一个接受一个参数的过程。由于该过程不是最后一个表达式,因此它被丢弃并丢弃,最后一个表达式是 numbers
。因此你会得到 (1 2 3)
作为结果。
这可行:
(define my+func
(lambda numbers
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers))))))
可以翻译回加糖的define
:
(define (my+func . numbers)
(if (null? numbers)
0
(+ (car numbers) (apply my+func (cdr numbers)))))
注意 apply
。这是因为您不能将 (my+func '(2 3))
作为递归发送,但它必须是 (my+func 2 3)
,这就是 apply
所做的。或者,您可以制作一个使用列表的助手:
(define (my+func . numbers)
(define (helper ns)
(if (null? ns)
0
(+ (car ns) (helper (cdr ns)))))
(helper numbers))
通常人们会为助手中的数字选择相同的名称,但我记得我对不相同的阴影变量感到困惑。