计算数量的方法不同

时间:2015-01-18 18:14:38

标签: algorithm racket integer-partition

我需要编写一个函数,它将返回以自然数之和写成的n(n是自然数)的方式。 例如:4可写为1 + 1 + 1 + 1,1 + 1 + 2,2 + 2,3 + 1和4。 我编写了一个函数来返回所有选项的数量,但没有考虑到可能性1 + 1 + 2和2 + 1 + 1(以及所有类似情况)相等。因此,对于n = 4,它返回8而不是5。 这是我的功能:

(define (possibilities n)
   (define (loop i)
      (cond [(= i n) 1]
         [(> i n) 0]
         [(+ (possibilities (- n i)) (loop (+ i 1)))]))
     (cond [(< n 1) 0]
        [#t (loop 1)]))

你可以帮我修复我的功能,它会按照应有的方式工作。谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个众所周知的函数,它被称为partition function P,它的可能值在整数序列的在线百科全书中被引用为A000041

一个简单的解决方案(不是最快的!)就是使用这个帮助函数,它表示将n写成k项的总和的方式的数量:

(define (p n k)
  (cond ((> k n) 0)
        ((= k 0) 0)
        ((= k n) 1)
        (else 
         (+ (p (sub1 n) (sub1 k))
            (p (- n k) k)))))

然后我们只需添加可能的结果,小心边缘情况:

(define (possibilities n)
  (cond ((negative? n) 0)
        ((zero? n) 1)
        (else
         (for/sum ([i (in-range (add1 n))])
           (p n i)))))

例如:

(map possibilities (range 11))
=> '(1 1 2 3 5 7 11 15 22 30 42)