2011-11-23 71 views
1

我試圖通過向現有列表添加編號來創建列表。問題是現有的列表實際上不一定是列表。它可以是一個空列表((list)),只是一個數字或實際列表。從計劃中編號和編號或列表和編號構建列表

基本上,我需要像append但它必須能夠處理這種情況:

(append 1 2)並生成一個列表(list 1 2)

除了典型案例:

(append (list 1 2) 3)

使用第一個案例的追加給我的錯誤append: expected argument of type <proper list>; given 1

是否有類似append可以處理這兩種情況?或者有其他方法可以做到這一點嗎?

謝謝!

+0

這似乎是一個功課,我(你應該相應地標記)。順便有這個清單?功能可以幫助您 – Eineki

+0

您使用哪種語言級別? – Eineki

+0

我只是想學習計劃。這不是功課。 – Computerish

回答

2

試試這個簡單的程序,並告訴我,如果它解決您的問題:

#lang racket 
(define (apnd a b) 
    (flatten (cons a b)) 
) 

#test 
(apnd 1 2) 
(apnd (list 1 2) (list 3 4)) 
(apnd '() 1) 
(apnd 1 '()) 
(apnd '() '()) 
(apnd (list 1 2) 3) 
(apnd 1 (list 2 3)) 

參考文獻:flatten

0

我會寫一個函數來做到這一點。

編輯:正如其他人所說,這看起來像是功課。基本上你想在函數中使用一個條件來檢查它是否是一個列表並相應地執行。

2

這裏是一個非常簡單的解決方案,從以下的How to Design Programs設計配方。

;; An Input is one of 
;; - Number 
;; - Listof[Number] 

;; to-list : Input -> Listof[Number] 
;; convert the input to a list if necessary 
(define (to-list v) 
    (cond [(number? v) (list v)] 
     [else v])) 

;; append* : Input Input -> Listof[Number] 
;; append two inputs, converting to lists first if necessary 
(define (append* a b) 
    (append (to-list a) (to-list b))) 
2
Welcome to Racket v5.1.1. 
-> ;; First, you gave this example 
(append (list 1 2) 3) 
'(1 2 . 3) 
-> ;; but notice that's not a proper list 
(list? '(1 2 . 3)) 
#f 
-> ;; you probably meant 
(append (list 1 2) (list 3)) 
'(1 2 3) 
-> ;; which is a list 
(list? '(1 2 3)) 
#t 
-> ;; I would make something like Sam's function 
;; but it converts anything to a list 
(define (any->list x) 
    (cond 
    [(list? x) x] 
    [else (list x)])) 
-> ;; So for example: 
(any->list 1) 
'(1) 
-> (any->list (list 1)) 
'(1) 
-> ;; and then you use that in a variation of append 
(define (my-append a b) 
    (append (any->list a) (any->list b))) 
-> ;; so you can do any of these: 
(my-append 1 2) 
'(1 2) 
-> (my-append '(1) 2) 
'(1 2) 
-> (my-append 1 '(2)) 
'(1 2) 
-> (my-append '(1) '(2)) 
'(1 2) 
->