簡體   English   中英

在使用遞歸的球拍中,如果列表“ L”的總和為n但L中的值沒有重復,我如何返回#true

[英]In Racket using recursion how do I return #true if a list “L” sums to n but no values in L are duplicated

這個問題可能有點復雜,但是我不確定,這個問題對我來說似乎至少很復雜。 我本質上是在嘗試編寫由(listof Num)和Num組成的一段代碼。 如果L是表示n的埃及分數,則我的函數將輸出#true。 埃及分數是分子為1的不同分數的總和,以防萬一某些人不知道。 目前,我已經開始編寫代碼,並且有解決該問題的想法,但不知道下一步該怎么做。 我非常希望答案保持現在的格式。 我正在練習遞歸並嘗試對其進行改進。

在我的代碼中,我有一個基本情況,如果列表為空,則輸出#false。

然后,我寫了一個情況,如果重復L中的任何值,則函數輸出#false

然后,我寫了一個情況,如果L的所有值的總和等於n的值,該函數將返回#true。

我的最后一種情況只是輸出#false,表示L中的值之和不等於n。

我的代碼的思考過程似乎是正確的,但是我的代碼實際上不起作用。 這是我的代碼

(define (egyptian? L n)
  (cond
    [(empty? L) #false]
    [(equal? (first L) (first (rest L)) (egyptian? (rest L))) #false]
    [( = n (+ (first L) (egyptian? (rest L))))#true]
    [else #false]))

這是函數應該輸出的

(check-expect (egyptian? (list 1/2 1/3 1/6) 1) #true)
(check-expect (egyptian? (list 1/2 1/4 1/5 1/20) 1) #true)
(check-expect (egyptian? (list 1/2 1/3 1/4 1/5 1/6) 1.5) #false)
(check-expect (egyptian? (list 1/2 1/2 1/2 1/2) 1) #false)

如您所見,前兩種情況為#true,因為列表中值的總和等於“ n”。 第三種情況是不正確的,因為列表中的值之和不等於“ n”。 第四種情況是不正確的,因為列表中的值是重復的。 希望我已經提供了有關我正在努力解決的問題的足夠信息。

最好的策略(以及許多其他問題)是將問題分成較小的部分。 讓我們從查找列表中所有數字的總和開始,這應該很容易:

(define (sum L)
  (if (empty? L)
      0
      (+ (first L)
         (sum (rest L)))))

現在,讓我們編寫一個過程,以檢查列表中的元素是否唯一。 這並不像檢查列表中的一項與下一項一樣簡單,重復項可以在列表中的任何位置!

(define (unique? L)
  (cond ((empty? L) #true)
        ((member (first L) (rest L)) #false)
        (else (unique? (rest L)))))

有了這些程序,我們的主要問題就變得難以解決:

(define (egyptian? L n)
  (and (unique? L)
       (= (sum L) n)))

現在您將看到,功能組合的概念多么強大! 在您嘗試的解決方案中,您在一個過程中混合了三個不同問題的代碼,這使事情變得很難理解。

將問題分解為較小的部分的另一個不錯的效果是,您可以稍后切換實現,以獲得更有效的解決方案。 例如,這就是我們寫sumunique? 慣用球拍中的程序:

(define (sum L)
  (apply + L))

(define (unique? L)
  (= (length L) (set-count (list->set L))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM