如何编写一个将列表中的每个元素与给定数字(x)相乘的过程。如果给出列表'(1 2 3)且x = 3 ,程序应该返回(3 6 9)将项目列表乘以某个数字'x'
我尝试:
(define (mul-list list x)
(if (null? list)
1
(list(* x (car list))(mul-list (cdr list)))))
上面的代码似乎没有改变work.What做我必须做什么呢?请帮忙
在此先感谢。
如何编写一个将列表中的每个元素与给定数字(x)相乘的过程。如果给出列表'(1 2 3)且x = 3 ,程序应该返回(3 6 9)将项目列表乘以某个数字'x'
我尝试:
(define (mul-list list x)
(if (null? list)
1
(list(* x (car list))(mul-list (cdr list)))))
上面的代码似乎没有改变work.What做我必须做什么呢?请帮忙
在此先感谢。
这是教科书例子,你应该使用map
,而不是重新发明轮子:
(define (mul-list lst x)
(map (lambda (n) (* x n)) lst))
但我想,要从头开始实现它。您的代码中存在以下问题:
list
一个参数,即具有相同名称的内置程序冲突 - 一个,你目前正在使用!list
cons
荷兰国际集团元素构建列表你忘了第二个参数传递到递归的mul-list
调用这应该可以解决所有的bug:
(define (mul-list lst x)
(if (null? lst)
'()
(cons (* x (car lst))
(mul-list (cdr lst) x))))
无论哪种方式,它按预期工作:
(mul-list '(1 2 3) 3)
=> '(3 6 9)
对于其扩展名(*为/列表,用于/第一,为/最后的/总和,为/产品,为/和,用于/或等:https://docs.racket-lang.org/reference/for.html)是非常有用的循环在球拍:
(define (ml2 lst x)
(for/list ((item lst))
(* item x)))
测试:
(ml2 '(1 2 3) 3)
输出:
'(3 6 9)
我发现在很多情况下,'for'实现提供简短,简单易懂的代码。
非常感谢!你可以请建议我一个初学者的书学习计划:) – mike
@mike肯定,高兴:)。 “小小的Schemer”和“如何设计程序”是非常棒的,“计算机程序的结构和解释”是有史以来最好的编程书籍之一,尽管它有点更先进 –
非常感谢:)ÓscarLópez。这是一个不错的列表 – mike