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;
}