Math 球拍/方案中的和平方
我在用racket/scheme递归地写出和的平方。代码对数字求和,但不对平方。我不知道我做错了什么。如果我通过10,应该是3025Math 球拍/方案中的和平方,math,scheme,lisp,racket,Math,Scheme,Lisp,Racket,我在用racket/scheme递归地写出和的平方。代码对数字求和,但不对平方。我不知道我做错了什么。如果我通过10,应该是3025 (define (squareOfSums n) (if (= n 0) 0 (expt (+ n (squareOfSums (- n 1))) 2))) 您应该只在递归结束时执行一次平方运算。目前,您的代码在每次迭代中都是方形的。解决这个问题的一种方法是将求和部分分离成一个helper过程,并将调用它的结果平方。像这样: (define (squ
(define (squareOfSums n)
(if (= n 0)
0
(expt (+ n (squareOfSums (- n 1))) 2)))
您应该只在递归结束时执行一次平方运算。目前,您的代码在每次迭代中都是方形的。解决这个问题的一种方法是将求和部分分离成一个helper过程,并将调用它的结果平方。像这样:
(define (squareOfSums n)
(define (sum n)
(if (= n 0)
0
(+ n (sum (- n 1)))))
(sqr (sum n)))
还有,你知道吗,把所有的自然数加到n上有一个a?这是一个更好的解决方案,不需要递归:
(define (squareOfSums n)
(sqr (/ (* n (+ n 1)) 2)))
无论哪种方式,它都能按预期工作:
(squareOfSums 10)
=> 3025
您应该只在递归结束时执行一次平方运算。目前,您的代码在每次迭代中都是方形的。解决这个问题的一种方法是将求和部分分离成一个helper过程,并将调用它的结果平方。像这样:
(define (squareOfSums n)
(define (sum n)
(if (= n 0)
0
(+ n (sum (- n 1)))))
(sqr (sum n)))
还有,你知道吗,把所有的自然数加到n上有一个a?这是一个更好的解决方案,不需要递归:
(define (squareOfSums n)
(sqr (/ (* n (+ n 1)) 2)))
无论哪种方式,它都能按预期工作:
(squareOfSums 10)
=> 3025
我认为这是一个惯用的版本,但我希望任何懂数学的人都不会写:
(define (square-of-sums n)
(let loop ([m n] [sum 0])
(if (> m 0)
(loop (- m 1) (+ sum m))
(* sum sum))))
(define (square-of-sums n)
(expt (/ (* n (+ n 1)) 2) 2))
这是一个懂数学的人会写的版本:
(define (square-of-sums n)
(let loop ([m n] [sum 0])
(if (> m 0)
(loop (- m 1) (+ sum m))
(* sum sum))))
(define (square-of-sums n)
(expt (/ (* n (+ n 1)) 2) 2))
我希望人们不要用众所周知的封闭式解决方案来问家庭作业问题:这是在积极鼓励人们编写糟糕的程序。我认为这是一个惯用的版本,但我希望任何懂数学的人都不会这样写:
(define (square-of-sums n)
(let loop ([m n] [sum 0])
(if (> m 0)
(loop (- m 1) (+ sum m))
(* sum sum))))
(define (square-of-sums n)
(expt (/ (* n (+ n 1)) 2) 2))
这是一个懂数学的人会写的版本:
(define (square-of-sums n)
(let loop ([m n] [sum 0])
(if (> m 0)
(loop (- m 1) (+ sum m))
(* sum sum))))
(define (square-of-sums n)
(expt (/ (* n (+ n 1)) 2) 2))
我希望人们不要用众所周知的封闭式解决方案来问家庭作业问题:这会积极鼓励人们编写糟糕的程序。如果你从函数开始,先写一些例子,就可以更容易地想象出函数的工作方式 以下是三个例子:
(check-expect (SquareOfSums 0) 0)
(check-expect (SquareOfSums 2) (sqr (+ 2 1))) ;9
(check-expect (SquareOfSums 10) (sqr (+ 10 9 8 7 6 5 4 3 2 1))) ;3025
我们可以清楚地看到,我们正在使用两个操作符,这应该表明我们需要使用某种帮助函数来帮助我们
我们可以从SUMS的主要功能开始:
现在,我们必须创建helper函数
使用加法运算符的次数取决于使用的次数。由于这个原因,我们将不得不使用自然递归
使用自然递归需要某种基本情况,以便函数在某个地方“结束”。在本例中,这是值0
既然我们已经确定了基本情况,我们就可以轻松创建帮助函数了:
(define (sum n)
(if (= 0 n)
0
(+ n (sum (sub1 n)))))
如果你从函数开始写一些例子,你会更容易想象你的函数是如何工作的 以下是三个例子:
(check-expect (SquareOfSums 0) 0)
(check-expect (SquareOfSums 2) (sqr (+ 2 1))) ;9
(check-expect (SquareOfSums 10) (sqr (+ 10 9 8 7 6 5 4 3 2 1))) ;3025
我们可以清楚地看到,我们正在使用两个操作符,这应该表明我们需要使用某种帮助函数来帮助我们
我们可以从SUMS的主要功能开始:
现在,我们必须创建helper函数
使用加法运算符的次数取决于使用的次数。由于这个原因,我们将不得不使用自然递归
使用自然递归需要某种基本情况,以便函数在某个地方“结束”。在本例中,这是值0
既然我们已经确定了基本情况,我们就可以轻松创建帮助函数了:
(define (sum n)
(if (= 0 n)
0
(+ n (sum (sub1 n)))))
也许是因为所有递归也都会求其部分和的平方?首先求和,然后求结果的平方。也许是因为所有递归也会求其部分和的平方?首先求和,然后求结果的平方。