Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案显示完美的正方形_Scheme_Racket - Fatal编程技术网

Scheme 方案显示完美的正方形

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)) () 我设法做了类似的事情,但不是显示完美正方形的数字,而是显示不完美正方形的数字。此

我正在尝试创建一个函数,该函数接受一个参数,并使用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))
()
我设法做了类似的事情,但不是显示完美正方形的数字,而是显示不完美正方形的数字。此外,我无法理解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)

我感谢您的帮助,并设法将结果按顺序返回。如何在函数中使用映射、应用或过滤??另外,感谢最后的提示,我放了这样的括号来帮助我跟踪函数中的级别。我感谢您的帮助,并设法让结果按顺序返回。如何在函数中使用映射、应用或过滤??另外,感谢最后的提示,我放置了这样的括号来帮助我跟踪函数中的级别