2016-10-02 47 views
1

如何编写一个将列表中的每个元素与给定数字(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做我必须做什么呢?请帮忙

在此先感谢。

回答

1

这是教科书例子,你应该使用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) 
+0

非常感谢!你可以请建议我一个初学者的书学习计划:) – mike

+0

@mike肯定,高兴:)。 “小小的Schemer”和“如何设计程序”是非常棒的,“计算机程序的结构和解释”是有史以来最好的编程书籍之一,尽管它有点更先进 –

+0

非常感谢:)ÓscarLópez。这是一个不错的列表 – mike

0

对于其扩展名(*为/列表,用于/第一,为/最后的/总和,为/产品,为/和,用于/或等: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'实现提供简短,简单易懂的代码。

相关问题