Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算数字的不同方法_Algorithm_Racket_Integer Partition - Fatal编程技术网

Algorithm 计算数字的不同方法

Algorithm 计算数字的不同方法,algorithm,racket,integer-partition,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]

我需要写一个函数,它将返回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)]))
(定义(n)
(定义(循环i)
(cond[(=in)1]
[(>IN0]
[(+(可能性(-ni))(循环(+i1))]))
(条件[(

你能帮我修好我的功能吗,这样它就可以正常工作了。谢谢。

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

一个简单的解决方案(不是最快的!)是使用这个helper函数,它将书写
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)

注意如何使用
cond
。最后一个条件应该使用
else
,而不是
#t
,而且绝对不能像函数第5行那样使用没有条件的表达式。