栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

计算滚动一定数量的方式的数量

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算滚动一定数量的方式的数量

使用生成函数方法的解决方案

N(d, s)
可能最容易编程。您可以使用递归很好地对问题建模:

public int numPossibilities(int numDice, int sum) {    if (numDice == sum)        return 1;    else if (numDice == 0 || sum < numDice)        return 0;    else        return numPossibilities(numDice, sum - 1) +    numPossibilities(numDice - 1, sum - 1) -    numPossibilities(numDice - 1, sum - 7);}

乍一看,这似乎是一个相当简单有效的解决方案。但是你会发现相同的值,很多计算

numDice
sum
可重复并重新计算一遍又一遍,使可能比你原来的强制方法效率较低这一解决方案。例如,在计算
3
骰子的所有计数时,我的程序
numPossibilities
总共运行了函数一次
15106
,而不是只
6^3= 216
执行一次的循环。

为了使该解决方案可行,您需要添加另一种技术-
先前计算结果的记忆(缓存)。

HashMap
例如,使用一个对象,您可以存储已经计算出的组合,并在运行递归之前先引用它们。当我实现一个缓存时,该
numPossibilities
函数只运行
151
总时间来计算
3
骰子的结果。

随着骰子数量的增加,效率提高也越来越大(结果基于我自己实现的解决方案的仿真结果):

# Dice | Brute Force Loop Count | Generating-Function Exec Count3      | 216 (6^3)   | 1514      | 1296 (6^4)  | 2615      | 7776 (6^5)  | 4016      | 46656 (6^6) | 5717      | 279936 (6^7)| 771...20     | 3656158440062976       | 6101


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号