无聊用scheme做了一道c++算法的小题目

题目是这样的:设计讲数组A[0...n-1]中所有奇数移到所有偶数之前的算法,要求不另增加储存空间,且时间复杂度为O(n).

以往我用常规的思维会这样设计,设两个整型变量i,j, i指向A[0]所在位置, j指向A[n-1]所在位置. 然后对数组进行遍历,如果发现是奇数,则将A[i]和当前数调换, 如果是偶数,则将A[j]和当前数调换,直到遍历结束.
但现在用递归思想重新思考这道题, 设f(n)为奇偶调换的函数,n为数组.g(n)为取出数组的第1个元素的函数 定义运算符 "+" 为连接元素和数组. "-"为删除m个元素后的数组.
那么 可得递归方程 f(n) = g(n) + f(n-1)      g(n)为奇数
                                               = f(n-1) + g(n)     g(n)为偶数
                                               = null                    n = 0
完整的scheme代码为:
(define (swap-list items)
  (define (append list1 list2)
    (cond ((null? list1) list2)
          (else (cons (car list1) (append (cdr list1) list2)))))
  (cond ((null? items) '())
        ((= (remainder (car items) 2) 0)
         (append (swap-list (cdr items)) (list (car items))))
        (else
         (append (list (car items)) (swap-list (cdr items))))))

posted @ 2007-01-09 20:58  浅蓝の天   阅读(471)  评论(1编辑  收藏  举报