Scheme 方案显示完美的正方形
我正在尝试创建一个函数,该函数接受一个参数,并使用map、apply和/或filter的组合来只返回完全平方的数字。比如说Scheme 方案显示完美的正方形,scheme,racket,Scheme,Racket,我正在尝试创建一个函数,该函数接受一个参数,并使用map、apply和/或filter的组合来只返回完全平方的数字。比如说 > (perfect-squares `(1 2 3 4 5 6 7 8 9)) (1 4 9) > (perfect-squares '(15 16 17 24 25 26 25)) (16 25 25) > (perfect-squares '(2 3 5 6)) () 我设法做了类似的事情,但不是显示完美正方形的数字,而是显示不完美正方形的数字。此
> (perfect-squares `(1 2 3 4 5 6 7 8 9))
(1 4 9)
> (perfect-squares '(15 16 17 24 25 26 25))
(16 25 25)
> (perfect-squares '(2 3 5 6))
()
我设法做了类似的事情,但不是显示完美正方形的数字,而是显示不完美正方形的数字。此外,我无法理解map、apply和filter的实现。这就是迄今为止我们所做的
(define (perfect-squares li)
(cond
((null? li) '())
((integer? (sqrt (car li)))
(perfect-squares (cdr li)))
(else
(cons (car li) (perfect-squares (cdr li)))
)
)
)
将任务分成子任务是最容易的。以下是一个根据您给出的逻辑识别正方形的函数:
(define (square? n) (integer? (sqrt n)))
然后,您可以使用过滤器识别正方形:
> (filter square? '(1 2 3 4 5 6 7 8 9))
(1 4 9)
你的程序是反向的。当数字不是平方时,应重复出现,并在以下情况下将其转换为累加输出:
(define (perfect-squares li)
(define (perfect-squares-helper li result)
(cond ((null? li) result)
((integer? (sqrt (car li)))
(perfect-squares-helper (cdr li) (cons (car li) result)))
(else (perfect-squares-helper (cdr li) result))))
(perfect-squares-helper li '()))
请注意,这会以相反的顺序返回结果,这是将结果累加到列表中的方法的特点:
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(9 4 1)
顺便说一句,经验丰富的Scheme程序员普遍避免使用将右括号放在单独的行上的方法。只需将它们堆叠在最后一行代码的末尾
编辑:在注释中,Renato询问如何在函数内部使用映射、过滤和应用。我们不需要映射或应用,但下面是使用过滤器的函数:
(define (perfect-squares xs)
(define (square? x)
(integer? (sqrt x)))
(filter square? xs))
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(1 4 9)
将任务分成子任务是最容易的。以下是一个根据您给出的逻辑识别正方形的函数:
(define (square? n) (integer? (sqrt n)))
然后,您可以使用过滤器识别正方形:
> (filter square? '(1 2 3 4 5 6 7 8 9))
(1 4 9)
你的程序是反向的。当数字不是平方时,应重复出现,并在以下情况下将其转换为累加输出:
(define (perfect-squares li)
(define (perfect-squares-helper li result)
(cond ((null? li) result)
((integer? (sqrt (car li)))
(perfect-squares-helper (cdr li) (cons (car li) result)))
(else (perfect-squares-helper (cdr li) result))))
(perfect-squares-helper li '()))
请注意,这会以相反的顺序返回结果,这是将结果累加到列表中的方法的特点:
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(9 4 1)
顺便说一句,经验丰富的Scheme程序员普遍避免使用将右括号放在单独的行上的方法。只需将它们堆叠在最后一行代码的末尾
编辑:在注释中,Renato询问如何在函数内部使用映射、过滤和应用。我们不需要映射或应用,但下面是使用过滤器的函数:
(define (perfect-squares xs)
(define (square? x)
(integer? (sqrt x)))
(filter square? xs))
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(1 4 9)
我感谢您的帮助,并设法将结果按顺序返回。如何在函数中使用映射、应用或过滤??另外,感谢最后的提示,我放了这样的括号来帮助我跟踪函数中的级别。我感谢您的帮助,并设法让结果按顺序返回。如何在函数中使用映射、应用或过滤??另外,感谢最后的提示,我放置了这样的括号来帮助我跟踪函数中的级别