递归算法到简单的计数问题

时间:2015-09-29 15:03:38

标签: algorithm recursion

一件物品花费1美元,当我们返回3件物品的包装时,我们又得到一件物品。 例如:如果我们有15美元,我们可以买22件物品

  1. 15件
  2. 使用5套3包装的5件物品
  3. 1项使用3个包装(2个包装额外)
  4. 使用2个额外包装+最后一个包装的另外1个项目。
  5. 我可以写一个程序来计算nr。物品可以用n美元购买。但是如何使用递归关系来解决它?

2 个答案:

答案 0 :(得分:1)

假设你不能退回包装,你会用n美元购买n件商品。现在,由于返回包装器,你会得到多少?在第一次迭代中,您将获得(n / 3)更多项目,并且在使用这些项目之后,您将拥有(n%3)+(n / 3)个包装器(不要忘记n%3 - 您可能没有返回所有包装器)。现在从(n%3)+(n / 3)项中返回包装器可以获得多少项?表示m =(n%3)+(n / 3),然后得到(m%3)+(m / 3)。然后你可以从这些项目中继续返回包装器等等。让我们用 0 = n来表示你在第一次购买后拥有的包装数量,然后用 i + 1 表示返回后你将拥有的包装数量来自 i 的包装器。然后你会有一个 i + 1 = a i %3 +一个 i / 3这是你的递归关系。

请注意, i 表示每次迭代后您拥有的包装数量,但添加数字 i 将不会产生您获得的项目总数但会更多(这是因为额外的 i %3)。在实施解决方案时,您必须注意这一点。

答案 1 :(得分:0)

@Ivaylo,谢谢你的提示。我一直在寻找优雅的递归关系。我希望我能得到它。 count(n,n)的调用是必需的解决方案。

#w_l      : Wrappers left after each iteration
#cnt_items: Total Count of of items got after each iteration

count(w_l,cnt_items) = count(w_l/3+w_l%3,cnt_items+w_l/3)#wl >= 3
                     = cnt_items                         #w_l <3