List 在使用递归的Racket中,如何返回“如果列表为true”;L";与n的和,但L中没有重复的值

List 在使用递归的Racket中,如何返回“如果列表为true”;L";与n的和,但L中没有重复的值,list,recursion,boolean,racket,List,Recursion,Boolean,Racket,这个问题可能有点复杂,但我不确定,这个问题对我来说至少相当复杂。我实际上是在写一段代码,它由一个(listof Num)和一个Num组成。如果L是一个表示n的埃及分数,我的函数将输出#true。埃及分数是不同分数的总和,其中分子为1,以防万一有些人不知道。我目前已经开始编写代码,并有了解决问题的想法,但不知道下一步该怎么做。我非常希望答案保持现在的格式。我正在练习递归,并试图用它来改进 在我的代码中,我有一个基本情况,如果列表为空,它将输出#false 然后我写了一个例子,如果L中的任何值被重复

这个问题可能有点复杂,但我不确定,这个问题对我来说至少相当复杂。我实际上是在写一段代码,它由一个(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)

如您所见,前两种情况为#真,因为列表中的值之和等于“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)))
现在你看,函数组合的思想是多么强大!在您尝试的解决方案中,您在一个过程中混合了三种不同关注点的代码,这使得事情很难理解

将问题分解成更小的部分的另一个好效果是,您可以稍后切换实现,以获得更高效的解决方案。例如,这就是我们在惯用的Racket中编写
sum
unique?
过程的方法:

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

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

解决这一问题(以及许多其他问题)的最佳策略是将问题分成更小的部分。让我们从查找列表中所有数字的总和开始,这应该很容易:

(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)))
现在你看,函数组合的思想是多么强大!在您尝试的解决方案中,您在一个过程中混合了三种不同关注点的代码,这使得事情很难理解

将问题分解成更小的部分的另一个好效果是,您可以稍后切换实现,以获得更高效的解决方案。例如,这就是我们在惯用的Racket中编写
sum
unique?
过程的方法:

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

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

这应该返回什么值<代码>(埃及语?(列表)0)假设此处的列表为空,则应生成#true,因为空列表等于0。至少我是这么想的,这个值应该是多少<代码>(埃及语?(列表)0)假设此处的列表为空,则应生成#true,因为空列表等于0。至少我是这么想的。