当前位置:   article > 正文

约瑟夫下船游戏(python recursion)_个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们

个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

这是一个链表的循环遍历问题。

虽然递归并不是解决这个问题的最佳实践,但是也能很好的练手。

  1. # -*- coding:UTF-8 -*-
  2. '''
  3. 30 个人在一条船上,超载,需要 15 人下船。
  4. 于是人们排成一队,排队的位置即为他们的编号。
  5. 报数,从 1 开始,数到 9 的人下船。
  6. 如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
  7. calculate people who get down boat
  8. '''
  9. rangeCnt = 9
  10. totle = 15
  11. getDownList = []
  12. def check(people, start, tempCnt):
  13. print('tempCnt', tempCnt, 'start', start)
  14. if (tempCnt > 0):
  15. tempCnt += 1
  16. for i in range(start, len(people)):
  17. if (people[i] == 1):
  18. tempCnt += 1
  19. if (tempCnt == rangeCnt):
  20. people[i] = 0
  21. if (len(people) - len(getDownList) <= totle):
  22. return
  23. getDownList.append(i + 1)
  24. if (i + 1 >= len(people)):
  25. check(people, 0, 0)
  26. else:
  27. check(people, i + 1, 0)
  28. return
  29. if (i == len(people) - 1):
  30. check(people, 0, tempCnt - 1)
  31. people = []
  32. for i in range(0, 30):
  33. people.append(1)
  34. check(people, 0, 0)
  35. print(getDownList)

执行结果:

  1. tempCnt 0 start 0
  2. tempCnt 0 start 9
  3. tempCnt 0 start 18
  4. tempCnt 0 start 27
  5. tempCnt 2 start 0
  6. tempCnt 0 start 16
  7. tempCnt 0 start 26
  8. tempCnt 2 start 0
  9. tempCnt 0 start 7
  10. tempCnt 0 start 19
  11. tempCnt 0 start 0
  12. tempCnt 0 start 12
  13. tempCnt 0 start 24
  14. tempCnt 2 start 0
  15. tempCnt 0 start 8
  16. tempCnt 0 start 22
  17. tempCnt 3 start 0
  18. tempCnt 0 start 5
  19. tempCnt 0 start 23
  20. tempCnt 2 start 0
  21. [9, 18, 27, 6, 16, 26, 7, 19, 30, 12, 24, 8, 22, 5, 23]

通过代码执行结果我们也能看出执行栈深度!!!果然不是最佳方式。

递归从理解上可能会更加便利,但是往往递归并不是解决问题的最佳手段。

类似斐波那契数(爬楼梯)。

换一种实现方式

  1. # -*- coding:UTF-8 -*-
  2. '''
  3. 30 个人在一条船上,超载,需要 15 人下船。
  4. 于是人们排成一队,排队的位置即为他们的编号。
  5. 报数,从 1 开始,数到 9 的人下船。
  6. 如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
  7. calculate people who get down boat
  8. [9, 18, 27, 6, 16, 26, 7, 19, 30, 12, 24, 8, 22, 5, 23]
  9. '''
  10. rangeCnt = 9
  11. totle = 15
  12. getDownList = []
  13. def check(peopleList):
  14. downPeopleIndex = 0
  15. i = 0
  16. while (i > -1):
  17. if (peopleList[i] == 1):
  18. downPeopleIndex += 1
  19. if (downPeopleIndex == rangeCnt):
  20. peopleList[i] = 0
  21. getDownList.append(i+1)
  22. downPeopleIndex = 0
  23. if (len(getDownList) == len(peopleList) - totle):
  24. break
  25. if (i == len(peopleList) - 1):
  26. i = 0
  27. continue
  28. i += 1
  29. peopleList = []
  30. for i in range(0, 30):
  31. peopleList.append(1)
  32. check(peopleList)
  33. print(getDownList)

 执行结果

[9, 18, 27, 6, 16, 26, 7, 19, 30, 12, 24, 8, 22, 5, 23]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/434882
推荐阅读
相关标签
  

闽ICP备14008679号