2016-10-02 70 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'實現提供簡短,簡單易懂的代碼。

相關問題