【问题标题】:How is the term 'single pass' defined?“单程”一词是如何定义的?
【发布时间】:2012-10-28 22:37:24
【问题描述】:

一次性实现一个过程是否意味着非递归?或者这是否意味着该程序永远不应该在相同的信息上重复出现两次?

我之所以问这个问题是因为我的印象是这是第一个定义,但现在我偶然发现了一个作业问题,如果不使用递归我无法解决,但说“一次性完成”。

【问题讨论】:

    标签: recursion scheme


    【解决方案1】:

    “单程”意味着访问元素集合中的每个元素(例如:列表、数组、集合、向量、映射、树、图形、字符串等) (“迭代”)一次且仅一次 - 过程是递归还是迭代都没有关系。例如,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;
    }
    

    【讨论】:

      【解决方案2】:

      单次遍历是指您只在集合中迭代一次(每个元素只接触一次)。

      您可以通过像这样的简单迭代来完成此操作

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

      【讨论】:

      • 请注意,Scheme 中没有“普通迭代”(即不归结为递归的迭代构造)之类的东西。因此,任何非递归解决方案实际上都是零通过解决方案。
      • @sepp2k - 感谢您的澄清。
      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多