let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
递递礼物(房屋)
答案 0 :(得分:2)
很难理解递归,但它就像魔术一样。
在您的示例中,deliver_presents_recursively
的任务是向每个提供的房屋交付礼物。怎么样?好吧,很明显,一个人一次只能送一份礼物,所以deliver_presents_recursively
试图简化问题。
如果仅提供一所房子(if len(houses) == 1:
,deliver_presents_recursively
会送出礼物并退出(嗯,实际上是返回到调用函数)。
如果提供的房屋不止一个,它将把清单分成两半,然后尝试交付给上半部分,然后再交付给下半部分。由于deliver_presents_recursively
可以容纳任意数量的房屋,因此您可以重复使用该功能来尝试交付这两套较小的房屋。
递归需要一个对它自己的调用,该调用通常具有一个简化的参数集,即您要执行的操作(也就是说,您不想使用相同的参数来调用该函数,否则它将永远不会结束!)< / p>
递归还需要一个终止符,例如您的len(houses) == 1
。也就是说,在这种情况下,它不会再次调用自身。
在这种特殊情况下,使用像以下这样的简单迭代可能会有意义:
def deliver_presents_non_recursively(houses):
for house in houses:
print ("Delivering presents to", house)
但是您没有在尝试递归。
另一个简单的递归示例是阶乘(8!等于8 * 7 * 6 * 5 ...)。这样想:
What is 8 factorial?
- it's 8 * 7 factorial
What is 7 factorial?
- it's 7 * 6 factorial
What is 6 factorial?
- it's 6 * 5 factorial
What is 5 factorial?
- it's 5 * 4 factorial
What is 4 factorial?
- it's 4 * 3 factorial
What is 3 factorial?
- it's 3 * 2 factorial
What is 2 factorial?
- it's 2 * 1 factorial
What is 1 factorial?
- it's 1
therefore 2 * 1
therefore 3 * 2
therefore 4 * 6
therefore 5 * 24
therefore 6 * 120
therefore 7 * 720
therefore 8 * 5040
therefore 40320
查看每个实例如何比前一个实例“小”,直到达到终止点(1个阶乘),然后结果渗透回去。