我试图解决的问题:
(define my-sum
(lambda (x)
(+ x (- x 1))))
我已经定义了一般函数...我知道如何在没有递归的情况下在C ++中执行此操作。但我很难决定如何使用Scheme来解决这个问题。
到目前为止我得到了什么:
{{1}}
答案 0 :(得分:2)
这是一个纯粹的递归解决方案:
(define (my-sum x)
(if (zero? x)
0
(+ x (my-sum (- x 1)))))
不幸的是,这不是尾递归。这是一个尾递归的版本:
(define (my-sum x sum)
(if (zero? x)
sum
(my-sum (- x 1) (+ x sum))))
您可以这样称呼它:
(my-sum x 0)
此处,sum
是累加器。
你的第二个答案做了同样的事情,使用尾递归的内部辅助函数,在初始调用内部辅助函数时为累加器提供初始值。
答案 1 :(得分:1)
(define (my-sum n)
(define (my-sum-helper n m)
(if (= 0 n)
m
(my-sum-helper (- n 1) (+ n m))))
(my-sum-helper n 0))
答案 2 :(得分:1)
练习是使用递归函数将数字从1加到n。
这是SICP一书中的练习。可以从许多来源获得练习的解决方案。在这种情况下,“比尔蜥蜴”给出了一个非常好的解释:
http://www.billthelizard.com/2010/04/sicp-exercise-130-iterative-sums.html
请注意,在“真正的”球拍中,人们只会写:
(for/sum ([x (in-range 1 (+ n 1))]) ; let x run through 1, 2, ... n
x) ; add x to the running sum
答案 3 :(得分:0)
也可以在这里使用'named let'来实现一个易于理解的函数,该函数可以立即定义和应用递归:
(define (mysum n)
(let loop ((m 0)
(s 0))
(cond
[(> m n) s]
[else (loop (add1 m)
(+ s m))])))
此处可以省略关键字'else'。使用'if'的代码也可以在这里使用而不是'cond',因为只有2个条件。