正如标题所解释的那样,我有一个非常基本的编程问题,我还没有能够理解.过滤掉所有(非常聪明)"为了理解递归,你必须首先理解递归." 各种在线线程的回复我仍然没有得到它.
理解当面对不知道我们不知道的事情时,我们可能倾向于提出错误的问题或者错误地提出正确的问题我会分享我"想"我的问题,希望有类似观点的人可以分享一些一点点知识,有助于我打开递归灯泡!
这是函数(语法用Swift编写):
func sumInts(a: Int, b: Int) -> Int {
if (a > b) {
return 0
} else {
return a + sumInts(a: a + 1, b: b)
}
}
Run Code Online (Sandbox Code Playgroud)
我们将使用2和5作为我们的论点:
println(sumInts(a: 2, b: 5))
Run Code Online (Sandbox Code Playgroud)
显然答案是14.但我不清楚这个价值是如何实现的.
这些是我的两个挂断:
递归调用该函数直到满足条件.那个条件是a> b.满足此条件时,返回0.乍一看,我希望返回值为0,这显然是不正确的.
在每次迭代中打印出'a'的值会产生一个我期望的值:2,3,4,5(此时5 + 1> b满足第一个条件:a> b)但我仍然不喜欢看看如何实现14的价值.
我的第一个想法是,类似于以下内容的东西神奇地发生:
var answer = a;
answer += a+1 until a > b;
return answer;
Run Code Online (Sandbox Code Playgroud)
所以排除了魔法,我只是没有得到什么.我很想知道发生的事情不仅仅是隐含的.
如果有人能够解释在这种功能中技术上发生了什么以及为什么结果不是0以及最终如何a + sumInts(a: a + 1, b: b) = 14,我将永远负债累累.
我是麻省理工学院开放式课程的SICP课程的初学者,使用视频讲座和在线提供的书籍.昨天我遇到了一个例子,它询问我们是否可以编写一个程序来计算改变任何给定金额的方法的数量.
这个问题有一个简单的解决方案作为递归过程:
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
Run Code Online (Sandbox Code Playgroud)
如果你想检查更多,我从这里拿走它.
他们通过添加以下内容计算使用K种硬币改变数量(N)的数量(N):
没有第一类硬币的改变A的方式(X)的数量.
改变(A - D)的方式(Y)的数量,其中D是fisrt硬币的面额,使用所有K种类型的硬币.
问题是,我只是不明白这一点.接着,他们试图解释说:
"要明白为什么这是真的,请注意改变的方法可以分为两组:那些不使用任何第一种硬币的那些,以及那些使用任何第三种硬币的方法.因此,改变方法的总数对于某些金额等于不使用任何第一种硬币进行金额变更的方式的数量,加上假设我们使用第一种硬币进行变更的方式的数量.(最后一句话)与加法N = X + Y相同?)但后一个数字等于使用第一种硬币后剩余数量的变化方式的数量.(使用此硬币后,它们指的是方式是否使用第一种硬币进行更改?) " …
我正在我的人工智能实验室学习Prolog,从源头学习Prolog Now!.
在第5章中,我们来了解累加器.作为示例,给出了这两个代码片段. 查找列表的长度
没有累加器:
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
Run Code Online (Sandbox Code Playgroud)
与累加器:
accLen([_|T],A,L) :- Anew is A+1, accLen(T,Anew,L).
accLen([],A,A).
Run Code Online (Sandbox Code Playgroud)
我无法理解,这两个片段在概念上有何不同?累加器到底有什么不同?有什么好处?
蓄能器听起来像中间变量.(如果我错了,请纠正我.)到目前为止,我已经在我的程序中使用过它们,所以它真的是一个很大的概念吗?
我正在为考试做准备的任务之一让我创造
data Exp = T | F | And Exp Exp | Or Exp Exp | Not Exp deriving (Eq, Show, Ord, Read)
Run Code Online (Sandbox Code Playgroud)
然后它要求制作
folde :: a -> a -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> Exp -> a
这就是我提出的
folde :: a -> a -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> Exp -> a
folde t f a o …Run Code Online (Sandbox Code Playgroud) Fibonacci的这种实现很容易理解但很慢:
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)
实施Fibonacci之后很难理解,但速度非常快.它会立即在我的笔记本电脑上计算出第100,000个斐波纳契数.
fib = fastFib 1 1
fastFib _ _ 0 = 0
fastFib _ _ 1 = 1
fastFib _ _ 2 = 1
fastFib a b 3 = a + b
fastFib a b c = fastFib (a + b) a (c - 1)
Run Code Online (Sandbox Code Playgroud)
关于后一种实施,这里发生了什么神奇的事情,它是如何运作的?
recursion ×4
haskell ×2
accumulator ×1
algorithm ×1
coin-change ×1
fibonacci ×1
function ×1
prolog ×1
scheme ×1
sicp ×1