如何編寫一個將列表中的每個元素與給定數字(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