2015-10-04 63 views
0

我能夠制定方案代碼在方案中添加兩個缺點清單。 說,列表1 - '(P d。)列表2' 我的自定義使用CDR &汽車概念添加功能,可以像預期(P p p d。)(P p p p d)。在方案中乘以方案

不過,我現在想乘這兩個&基於P的數量,我有一個自定義功能,讓我表計數值。比方說,對於list1的 - > 1 list2-> 3

我還可以管理以檢測是否兩個列表中的任何一個是空的,所以I輸出「d。

但真正的問題是何時涉及乘法。 list1的 - '(第d。)列表2 - '(PPPPP Q值。) 結果預期 - (2×5 = 10個P的),因此「(。pppppppppp Z)

我嘗試使用while循環中,執行同時,加自定義功能,但我似乎無法弄清楚如何去做。也許一些指導能幫助我:)

我想建立一個自定義的功能,因爲我不希望使用一組!或任何使過程更容易,但想要了解遞歸的方式,它可以在這種情況下工作:)。

+0

什麼是'd'和'z'?通常,兩個列表的總和是標準程序'append',但它不能做虛線列表,因爲根據你,'(a。b)'後面的'(a。b)'是'(aa。b)',但是什麼關於第一個列表'b'?你寫了你說的代碼,但它在哪裏?如果你需要幫助,你需要付出一些努力。 – Sylwester

+0

你想實現peano號碼...對嗎? –

+0

你的邏輯是好的,但問題在於你的代碼的細節,因此只有邏輯和沒有代碼,我們很難猜測你做錯了什麼......你爲什麼不重寫它(它會採取不超過2分鐘,如果你知道你正在遵循的邏輯),所以我們可以檢查它? – HyperZ

回答

0

因爲它似乎解決您原來的問題,努力實現使用利弊列出方案皮亞諾號我加入這個作爲一個答案。

對於一個開始與零值和函數來遞增和遞減的數字。

;; We define our abstraction for zero 
(define zero 'D) 

;; Increment a number, i.e. get its successor 
(define (inc number) 
    (cons 'P number)) 

;; Decrement a number, i.e. get its predecessor 
(define (dec number) 
    (cdr number)) 

這允許遍歷所有(正)整數。在完成這些功能,我們可以建立遞歸性質的附加功能,利用:

a + 0 = a 
a + b = (a + 1) + (b - 1) 

同樣的乘法函數可以建立在add函數,使用:

a * 0 = 0 
0 * b = 0 
a * 1 = a 
a * b = a + (a * (b - 1)) 

這導致以下,雖然非常低效的代碼:

;; Adding two numbers is done by "shifting" from one to the other, one by one. 
;; a + b = (a + 1) + (b - 1) 
(define (add lhs rhs) 
    (if (eq? rhs zero) 
     lhs 
     (add (inc lhs) (dec rhs)))) 

;; Multiplying the dumb way: 
;; a * b = a + (a * (b - 1)) 
(define (mul lhs rhs) 
    (if (or (eq? rhs zero) (eq? lhs zero)) 
     zero 
     (if (eq? rhs (inc zero)) 
      lhs 
      (add lhs (mul lhs (dec rhs)))))) 

(Live example)

+0

非常感謝......我很快就會發布解決方案......但是,我發佈在我之前的評論中的問題似乎非常複雜,相比之下,我覺得peano號碼相對容易得多... – user222040

+0

這個問題與原來的問題?元組是什麼意思? –

+0

請看這裏:http://stackoverflow.com/a/32938978/1116364 –