在球拍中使用 lambda 进行迭代?
Iteration with lambda in racket?
这可能是一个简单的问题,但我似乎无法弄清楚。
在下面的示例中,我想创建一个递归创建项目列表的函数 list-of-obj
。
示例:
> (list-of-obj 'a 5)
'(a a a a a)
代码:
#lang racket
(define (list-of-obj obj n)
(letrec ((helper
(lambda (obj n result)
(if (> n 0)
(helper obj (- n 1) (cons obj result))
result))))
helper obj n 0))
然而,这会导致 0
的输出。任何指针?我是 racket/scheme.
的新手
Racket 中最惯用的解决方案是:
(make-list 5 'a)
=> '(a a a a a)
也就是说,如果内置函数可以满足您的需求,您就不应该重新发明轮子。但是如果你需要从头开始写,这应该可以解决问题:
(define (list-of-obj obj n)
(letrec ((helper
(lambda (obj n result)
(if (> n 0)
(helper obj (- n 1) (cons obj result))
result))))
(helper obj n '())))
您的代码有两个问题:
- 对
helper
的调用必须被 ()
包围,因为这就是您在 Scheme 中调用过程的方式。
- 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是您所拥有的
0
。
这可能是一个简单的问题,但我似乎无法弄清楚。
在下面的示例中,我想创建一个递归创建项目列表的函数 list-of-obj
。
示例:
> (list-of-obj 'a 5)
'(a a a a a)
代码:
#lang racket
(define (list-of-obj obj n)
(letrec ((helper
(lambda (obj n result)
(if (> n 0)
(helper obj (- n 1) (cons obj result))
result))))
helper obj n 0))
然而,这会导致 0
的输出。任何指针?我是 racket/scheme.
Racket 中最惯用的解决方案是:
(make-list 5 'a)
=> '(a a a a a)
也就是说,如果内置函数可以满足您的需求,您就不应该重新发明轮子。但是如果你需要从头开始写,这应该可以解决问题:
(define (list-of-obj obj n)
(letrec ((helper
(lambda (obj n result)
(if (> n 0)
(helper obj (- n 1) (cons obj result))
result))))
(helper obj n '())))
您的代码有两个问题:
- 对
helper
的调用必须被()
包围,因为这就是您在 Scheme 中调用过程的方式。 - 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是您所拥有的
0
。