我正在阅读SICP,并使用Racket博士SICP软件包作为IDE和解释器。来自国际预防犯罪中心的代码:
(define (sum func a next b)
(if (> a b)
0
(+ (func a)
(sum func (next a) next b))))
(define (inc n) (+ n 1))
(define (sum-cubes a b)
(sum cube a inc b))
(define (cube a) (* a a a))
(sum-cubes 1 10)
函数是计算从1到10的立方和。但是我
(define (fib n)
(fib-iter 1 0 n))
(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
只是和SICP玩得开心。我完全理解Fibonacci算法的概念,但这段代码让我感到困惑。与命令式的东西相比,最后一行到底做了什么(这只是一个基本的递归还是)?
为了我自己的学习和实践,我尝试在Javascript中实现一个函数,它会用从1到参数'limit‘的整数填充一个数组。我这样做的一种方法是使用for循环:
function getRange(limit) {
const range = [];
for (let i = 1; i <= limit; i++) {
range.push(i);
}
return range;
}
然后,为了练习,我想试着用一个递归函数来编写它,并得出了以下结论:
function recGetRange(limit, array) {
con
我正在使用SICP的书,我正在努力解决递归和迭代过程的概念。在问题1.17中,他们问:
练习1.17。本节中的指数算法是基于通过重复乘法进行指数运算的。以类似的方式,我们可以通过重复加法来执行整数乘法。以下乘法过程(假定我们的语言只能加,不能乘)类似于expt过程:
(define (* a b)
(if (= b 0)
0
(+ a (* a (- b 1)))))
该算法采用b中线性的几个步骤。现在,假设我们在加法的同时,将整数加倍,并将整数除以2的运算减半。利用这些步骤,设计一个类似于使用对数步骤数的快速扩展的乘法过程。
(资料来源:)
我做了以下代码,这似乎是正确的:
(d
今天,我在unix中发现了"time“命令,并认为我应该使用它来检查Haskell中的尾递归函数和普通递归函数之间的运行时差异。
我编写了以下函数:
--tail recursive
fac :: (Integral a) => a -> a
fac x = fac' x 1 where
fac' 1 y = y
fac' x y = fac' (x-1) (x*y)
--normal recursive
facSlow :: (Integral a) => a -> a
facSlow 1 = 1
facSl
我在F#中用下面的方式编写了sicp中的变更计数问题
let count_change amount =
let first_denomination kinds_of_coins =
match kinds_of_coins with
|1->1
|2->5
|3->10
|4->25
|5->50
let rec cc amount kinds_of_coins =
match (amount,kinds_of_coins)
不久前,在haskell中,我需要使用一个算法来解决一个KP问题
下面是我的代码:
stepKP :: [Int] -> (Int, Int) -> [Int]
stepKP l (p, v) = take p l ++ zipWith bestOption l (drop p l)
where bestOption a = max (a+v)
kp :: [(Int, Int)] -> Int -> Int
kp l pMax = last $ foldl stepKP [0 | i <- [0..pMax]] l
main = print $ k
我正在考古瑟拉的scala课程,我正在尝试在那里教的东西。所以现在我遇到了这个名单,他们称之为"ConsList“?我正在尝试给它一个尾递归toString()方法。我想我必须保留一些类似累加器的东西,但我也不知道该如何做。任何帮助都将不胜感激。
以下是我所尝试的:
/** a non-empty element/node of the list */
class Cons[T](val head: T, val tail: List[T]) extends List[T] {
def isEmpty = false;
override def toString() =
将m和n设为整数,我可以将它们乘以如下的连续和:
m * n = m + m + m + ... + m (n times)
因此,让我们考虑下面的伪代码:
m = ... (first number)
n = ... (second number)
Result = 0;
while (n > 0)
{
Result = Result + m;
n = n - 1;
}
如何在F#中实现这个算法,知道变量是不可变的?以另一种方式提出这个问题,如何在连续迭代过程中更新变量的结果和n?
有人能用F#
我试图将下面的循环转换为accumulate()调用,但失败得令人发指:
total = 0
for h in heat_values:
total += h
total -= total*0.25
我如何累积h的值,包括这个0.25衰变因子?
背景:我想这样做只是为了好玩,用函数编程的方式模拟同时加热和冷却的过程(添加操作是加热步骤,减法是冷却步骤)。我希望得到累积的值来绘制进程的值。
我是prolog中的新手,我想练习将尾递归代码重写为一个简单的递归,以更好地理解这个过程,但我没有成功。如果有人能帮忙的话,我会很感激的。
注意事项:在Prolog中将尾递归()代码转换为非尾递归代码并不是明智的做法。这个问题只是为了学术目的的学习。
守则:
some_predicate(T,1,3,0,D),
%the tail has elements with ID and Numbers like [(1,3),(2,5),(4,3)])
%in the D I count steps if different conditions are fulfilled
%I would l