Recursion 术语';单程';定义
在单个过程中实现过程是否意味着非递归?或者,这是否意味着该程序不应在同一信息上重复两次Recursion 术语';单程';定义,recursion,scheme,Recursion,Scheme,在单个过程中实现过程是否意味着非递归?或者,这是否意味着该程序不应在同一信息上重复两次 我问这个问题是因为我觉得这是第一个定义,但现在我偶然发现了一个家庭作业问题,如果不使用递归,我无法解决这个问题,而是说“在一次过程中完成”。一次过程就是只在集合中迭代一次(只接触每个元素一次) 您可以通过这样的简单迭代来完成这一点 for n from 0 to set length interact with set item n 或者你可以递归(c#) “单次传递”意味着元素集合中的每个元素(可以是列
我问这个问题是因为我觉得这是第一个定义,但现在我偶然发现了一个家庭作业问题,如果不使用递归,我无法解决这个问题,而是说“在一次过程中完成”。一次过程就是只在集合中迭代一次(只接触每个元素一次) 您可以通过这样的简单迭代来完成这一点
for n from 0 to set length
interact with set item n
或者你可以递归(c#)
“单次传递”意味着元素集合中的每个元素(可以是列表、数组、集合、向量、映射、树、图形、字符串等)被访问(“迭代”)一次且仅一次——不管过程是递归的还是迭代的。例如,Scheme中的以下递归过程在一次过程中添加列表中的所有元素:
(define (sum lst)
(if (null? lst)
0
(+ (car lst)
(sum (cdr lst)))))
同样的过程可以用一种方式编写——意思是:当递归调用发生在另一个过程中时,是它的最终操作;它可能会产生一个返回值,然后调用过程立即返回该值。无论如何,仅对列表中的元素执行一次传递:
(define (sum lst)
(let loop ((lst lst)
(acc 0))
(if (null? lst)
acc
(loop (cdr lst) (+ (car lst) acc)))))
将上述两个示例与Java中的这段代码进行比较:这是一种迭代方法,但再次在数组上执行一次传递:
int sum(int[] array) {
int acc = 0;
for (int x : array)
acc += x;
return acc;
}
请注意,Scheme中没有“普通迭代”(即不归结为递归的迭代构造)之类的东西。因此,任何非递归解决方案实际上都是零通解决方案。@sepp2k-感谢您的澄清。
int sum(int[] array) {
int acc = 0;
for (int x : array)
acc += x;
return acc;
}