【发布时间】:2012-10-28 22:37:24
【问题描述】:
一次性实现一个过程是否意味着非递归?或者这是否意味着该程序永远不应该在相同的信息上重复出现两次?
我之所以问这个问题是因为我的印象是这是第一个定义,但现在我偶然发现了一个作业问题,如果不使用递归我无法解决,但说“一次性完成”。
【问题讨论】:
一次性实现一个过程是否意味着非递归?或者这是否意味着该程序永远不应该在相同的信息上重复出现两次?
我之所以问这个问题是因为我的印象是这是第一个定义,但现在我偶然发现了一个作业问题,如果不使用递归我无法解决,但说“一次性完成”。
【问题讨论】:
“单程”意味着访问元素集合中的每个元素(例如:列表、数组、集合、向量、映射、树、图形、字符串等) (“迭代”)一次且仅一次 - 过程是递归还是迭代都没有关系。例如,Scheme 中的以下递归过程一次性添加列表中的所有元素:
(define (sum lst)
(if (null? lst)
0
(+ (car lst)
(sum (cdr lst)))))
同样的过程可以写成tail recursive 方式——意思是:当递归调用发生在另一个过程中时,是它的最终动作;它可能会产生一个返回值,然后由调用过程立即返回。无论如何,只对列表中的元素执行一次传递:
(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;
}
【讨论】:
单次遍历是指您只在集合中迭代一次(每个元素只接触一次)。
您可以通过像这样的简单迭代来完成此操作
for n from 0 to set length
interact with set item n
或者你可以递归(c#)
public int total(int[] numbers,int index)
{
if (index == numbers.Length - 1) return numbers[index];
return numbers[index] + total(numbers, index + 1);
}
int[] someInts = {1,2,3,4};
int intTotal = total(someInts,0);
【讨论】: