算法43

阅读: 评论:0

算法43

算法43

题目:

上面是著名的欧拉信封原题,我们将题目变化一下,假设有一个村庄,规定每个村民都要往外寄出一封信,但不能寄给自己,都要收到别人的一封信,假设有N位村民,有多少种寄法

分析:
从小样本开始枚举,看能不能递推出公式

1个人----0种
2个人----互相寄,1种
3个人----2种

当n大于4,情况有如何呢

现在假设有五个人

1 假设B寄给E 有两种情况

1)E也寄给B,那么B和E完成寄和收,不会跟系统发生关系了,系统剩下三人
2)E寄出了但没有寄给B,B和E的动作完整一半,剩下一半,可以将他两个人合并为一个人,那么相当于剩下4个人

2 同B寄给E一样,B也可以寄给ACD,那么B寄出的情况就有4种

由此可以推导出当有5个人的时候

f ( 5 ) = 4 ∗ ( f ( 3 ) + f ( 4 ) ) f(5)=4*(f(3)+f(4)) f(5)=4∗(f(3)+f(4))

一般公式就是:

f ( n ) = ( n − 1 ) ∗ ( f ( n − 1 ) + f ( f − 2 ) ) f(n)=(n-1)*(f(n-1)+f(f-2)) f(n)=(n−1)∗(f(n−1)+f(f−2))

代码:

package main
import ("fmt"
)func mail(n int)int{if n==1{return 0}if n==2{return 1}if n==3{return 2}return (n-1)*(mail(n-1)+mail(n-2))
}func main(){fmt.Println(mail(6))
}

本文发布于:2024-02-01 06:57:58,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170674187834719.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23