python - Python 递归(河内塔)
问题描述
我是 python 新手,遇到了一个可能很难解决的问题。
def req_steps(num_disks):
# implement this function
if num_disks == 0:
return 1
return 2 * req_steps(num_disks-1)
print("For moving {} disks, {} steps are required.".format(3, req_steps(3)))
该函数应该是 (2^n)-1 并且我无法让 -1 工作......它必须是一个递归函数。
提前致谢。
编辑:
最终的公式是=(2^(num_of_disks))-1
这意味着,num_of_disks = 3
应该给出7
哪个是(2*2*2-1)
动作。
解决方案
你可以给出最终答案f(n) = 2^n-1
,这是一个通用公式,而问题要求你使用递推公式f(n) = f(n-1) + 1 + f(n-1) when n > 1
。
def req_steps(num_disks):
if num_disks == 1:
return 1
else:
return 1 + 2 * req_steps(num_disks - 1)
print("For moving {} disks, {} steps are required.".format(3, req_steps(3)))
输出:
For moving 3 disks, 7 steps are required.
下面的递推公式表示当你想将 n 个圆盘从 A 移动到 C 时(假设 3 个放置圆盘的杆分别命名为 A、B 和 C),你可以:
- 将 n-1 个磁盘从 A 移动到 B,这需要 f(n-1) 步
- 将第 n 个磁盘从 A 移动到 C,需要 1 步
- 将 n-1 个磁盘从 B 移动到 C,这需要 f(n-1) 步
推荐阅读
- laravel - 如何使用父模型更新子表?
- c# - OOP将孩子转换为父母并返回
- azure-active-directory - Microsoft Graph:应用注册和 API 权限与请求的范围
- tensorflow - 如何在连接层时添加可训练的权重
- reactjs - 使用 material-ui 自动完成搜索多个域
- linux - 意外标记“换行”/var/www/html/index.html 附近的语法错误:第 1 行:“”
- flutter - 在 Flutter 中,将整个应用程序包装在 WillPopScope 中时,不会调用 onWillPop
- pyspark - YARN 容器在 spark 作业中失败,错误代码为 -104 和 143
- arrays - 检查 Postgres int[] 中是否存在多个 id
- php - 在 WooCommerce 管理订单列表中使自定义列可排序