
最近上课老师提到商人过河这个经典的智力问题,留给我们作课后作业。直觉告诉我直接用python岂不是分分钟的事,于是就直接用python递归开始实现。由于深受C的影响,中途发现python递归比起C语言递归实现起来差别不小。趁热打铁,这里就把求解过程记录下来。
目录
问题描述
三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。随从们密约,在河的任意一岸,一旦随从的人数比商人多,就杀人越货。但是如何乘船渡河的大权掌握在商人们手中。商人们怎样才能安全渡河呢?
求解思路
首先需要把这个问题用数学语言表示出来。商人与随从过河的过程,就是两岸人数状态不断变化的一个过程。我们可以用坐标(商人,随从)来表示源河岸当前的人数状态。
初始状态,设源河岸商人和随从均为N人,表示为:
1 |
start_point = [N,N] |
中间过程,船往返于两岸之间一次,两岸的人数变化一次。这个步骤中的每一次往返都涉及到两个因素,一是船的方向direct,二是对该次上船人员的决策decision。当船的方向是从源河岸驶向对面目的地时,可以表示为:
1 |
derict = 1 # at source river bank |
当船返回源河岸时:
1 |
derict = -1 # at dst river bank |
成功渡河后,源河岸随从和商人均为0人。
1 |
END = [0, 0] # destation point |
递归搜索
船往返于两岸之间,岸上人数的变化对应与坐标上的一个个点。需要把已经到达过状态记录下来,防止后面再次重复已经搜索过的路线:
1 |
src_reached_list = [] |
已经搜索过的状态以参数的形式传入递归搜索。此外,还需要传入的参数有当前状态下源岸边的人数,当前方向以及该方向对应的可行的决策。递归代码如下:
1 |
# return 0: success |
求解结果
可以得到四组结果。每组结果由source reached point序列和dst reached point序列构成。
1 |
[ |
附上源代码
1 |
import os |




近期评论