我递归地在球拍/方案中写总和的平方。该代码对数字求和,但是并不能对它求平方。我不知道我在做什么错。如果我通过10,那应该是3025。
(define (squareOfSums n)
(if (= n 0)
0
(expt (+ n (squareOfSums (- n 1))) 2)))
答案 0 :(得分:4)
在递归结束时,您应该仅一次进行平方。目前,您的代码会在每次迭代时平方。解决此问题的一种方法是将求和部分分成一个辅助过程,并平方调用结果。像这样:
library(data.table)
df <- data.table(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
## if the locale is not English, please use the local values for days
days <- data.frame(DOW = c("Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday"))
days$day <- seq(1,7,1)
df <- df[,DOW:= weekdays(date)]
df <- merge(df, days, all.x = T, by = "DOW")
df <- df[, EOW := date + (6 - day)]
df
DOW date week day EOW
1: Monday 2014-08-25 34 1 2014-08-30
2: Wednesday 2014-08-20 34 3 2014-08-23
3: Wednesday 2014-10-08 41 3 2014-10-11
此外,您是否知道有一个formula将所有自然数加到(define (squareOfSums n)
(define (sum n)
(if (= n 0)
0
(+ n (sum (- n 1)))))
(sqr (sum n)))
上?这是一个更好的解决方案,不需要递归:
n
无论哪种方式,它都能按预期工作:
(define (squareOfSums n)
(sqr (/ (* n (+ n 1)) 2)))
答案 1 :(得分:1)
我认为这是一个惯用的版本,但我希望没有任何数学的人会写:
<div class="dragitem1" draggable="true" ondragstart="drag(event)" id="drag1">
<p id="p1">TEST</p>
</div>
<div class="dropitem1" ondrop="drop(event)" ondragover="allowDrop(event)" id="drop1">
</div>
这是一个知道一些数学的人会写的版本:
(define (square-of-sums n)
(let loop ([m n] [sum 0])
(if (> m 0)
(loop (- m 1) (+ sum m))
(* sum sum))))
我希望人们不会以众所周知的封闭式解决方案提出作业问题:它正在积极鼓励人们编程不好。
答案 2 :(得分:1)
如果您通过编写一些示例来开始使用函数,则可以更直观地看到函数的工作方式。
以下是三个示例:
(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
我们可以清楚地看到,我们正在使用两个运算符,这表明我们需要使用某种辅助函数来帮助我们。
我们可以从主要功能squareOfSums
开始:
(define (squareOfSums n)
(sqr (sum n)))
现在,我们必须创建辅助函数。
您使用加法运算符的次数取决于您使用的次数。因此,我们将不得不使用自然递归。
使用自然递归需要某种基本情况,以便函数“结束”到某个地方。在这种情况下,该值为0
。
现在我们已经确定了基本情况,我们可以创建帮助函数了,几乎没有问题:
(define (sum n)
(if (= 0 n)
0
(+ n (sum (sub1 n)))))