球拍/方案中的和平方

时间:2019-01-30 01:11:26

标签: math scheme lisp racket

我递归地在球拍/方案中写总和的平方。该代码对数字求和,但是并不能对它求平方。我不知道我在做什么错。如果我通过10,那应该是3025。

(define (squareOfSums n)
 (if (= n 0)
  0
   (expt (+ n (squareOfSums (- n 1))) 2)))

3 个答案:

答案 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)))))