level 10
在 javascript 吧看到一道题目,蛮有意思的,可是很繁复,原文:
「
用javascript设计一个算法! 牛年求牛:有一母牛,到 4 岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁 死亡,问n年后有多少头牛。
」
请教各位老大,用 Excel 有办法解吗?
不论公式+辅助列或 vba 都可以。
2010年11月03日 12点11分
1
level 10
javascript 吧主写出解法了,原文:
「
function niu(b) {
for (var c = b < 20 ? 1: 0, a = 4; a <= b && a < 15; ++ a)
c += niu(b - a);
return c
}
alert(niu(10));
」
~~~~~~
我翻译为 vba 自定义函数:
Private Function niu(ByVal b As Variant)
c = IIf(b < 20, 1, 0)
a = 4
Do While 1
If Not (a <= b And a < 15) Then Exit Do
c = c + niu(b - a)
a = a + 1
Loop
niu = c
End Function
~~~
公式
=niu(年数)
~~~~~~
我对这种递回函数不太熟悉,不敢妄下定论,仅提供各位老大参考。
2010年11月04日 14点11分
9
吧务
level 10
我的电脑没有办法算出100年能有多少头牛-----
=niu(100)
当然算50年,还是可以的.
各位爷,用你们电脑挑战一下?100年,200年!
2010年11月05日 01点11分
10
吧务
level 10
回复:9楼
结果好像不对,我还找到一个自定义函数:
Function cCow(n As Long)
Dim i As Long, j As Long, k As Long
Dim arr(19) As Long
arr(0) = 1
For i = 1 To n
For j = 19 To 1 Step -1
arr(j) = arr(j - 1)
If j >= 4 And j <= 14 Then arr(0) = arr(0) + arr(j)
Next
arr(0) = 0
k = k + 1
Next
cCow = Application.Sum(arr)
End Function
_____________________
=ccow(年数)
2010年11月05日 01点11分
11
吧务
level 15
验证了一下,这个函数从第7年开始结果都不对了。
第7年应该有6头牛,但是niu函数的结果是5.
而且我觉得函数里C只增不减,所以除了最后一代的牛,其它都成了不死怪物了。
2010年11月05日 02点11分
12
吧务
level 15
ccow的思路真棒!比递归的方法快的多。
不过那个k=k+1没有用处吧?
2010年11月05日 02点11分
13
level 9
嘿嘿!
经过一翻屈指屈趾后发现,这牛的数量绝对超出了我的脑容量!这问题我决定不参与了。
2010年11月05日 02点11分
14
level 10
回复:12楼
>>第7年应该有6头牛,但是niu函数的结果是5.
第1年
第2年
第3年
第4年 +1
第5年 +1
第6年 +1
第7年 +1
+牛妈妈
总数 5只
第4年出世的牛女要到第8年才生牛孙,所以第7年有5只牛是
正确的
。
~~~~
我在9楼只如实翻译,并没验证过,等各位老大合力打造一个正确的程式。
2010年11月05日 10点11分
15
level 10
回复:12楼
自定义函数 niu 第2行有写,
c = IIf(b < 20, 1, 0)
凡进入函数的引数 b少於20才取1,否则取0。
2010年11月05日 10点11分
16
吧务
level 15
回复:15楼
我知道我们的分歧在哪里了。
你的意思是牛在刚出生的那年是0岁,在出生后第2年才1岁,到出生后第5年才4岁可以开始生育。
如果按照这样算的话,牛祖宗第1年也是0岁,要到第5年才能开始生哦。
我认为所有牛都和牛祖宗一样在出生后第4年就可以开始生了。
2010年11月05日 10点11分
17
level 10
回复:11楼
不能通过验证
第4年生牛女到第7年只3岁,不能生孙,所以第7年应该是5只。
11楼第7年是6只。
2010年11月05日 10点11分
19
level 10
回复:18楼
>>但是牛祖宗的那个1从来不会减掉。
假设求 niu(30)
程式首轮引入"30"
>> c = IIf(b < 20, 1, 0)
b<20 不真,得0
30年后牛祖宗已死,所以得0。
~~
又假设求 niu(18)
程式首轮引入"18"
>> c = IIf(b < 20, 1, 0)
b<20 为真,得1
18年后牛祖宗未死,所以得1。
2010年11月05日 13点11分
20
level 10
补充题目:
9楼原javascript程式及翻译vba预设每头母牛一生中生11只小牛(4至14岁)
出生日期与首次生小牛相距整数4年
出生日期与死亡日期相距整数20年
重整vba自定义函数:(完全符合原javascript程式)
Private Function niu(ByVal b As Variant)
niu = IIf(b < 20, 1, 0)
For a = 4 To 14
If a <= b Then niu = niu + niu(b - a)
Next
End Function
2010年11月05日 13点11分
21