原题解答
本次的题目如下所示:
阿克曼 (Ackmann)函数 A(m,n)中,m,n 定义域是非负整数 (m≤3,n≤10),函数值定义为:
akm(m,n)=n+1;(m=0时 )。
akm(m,n)=akm(m-1,1);(m>0,n=0 时 )。
akm(m,n)=akm(m-1,akm(m,n-1));(m,n>0)。输入格式
m 和 n。输出格式
函数值。输入样例
2 3
输出样例
9
本题从函数的定义上就可以看出,这个函数的定义是一个递归定义,而且从题目给出的m和n的值可以看出,它的层次并不是太深。此类题目首选就是直接使用函数的递归调用。如果能够想到使用递归,这道题可以说一点难度都没有的。题目中递归的条件都已经给我们了,我们直接将它转换成代码即可直接写出代码:
def akm(m, n):
if m == 0:
return n + 1
elif m > 0 and n == 0:
return akm(m-1, 1)
else:
return akm(m-1, akm(m, n-1))
m, n = map(int, input().split())
print(akm(m, n))
本题拓展
本题考查的是函数的递归调用,题目难度★★★
原题中的递归调用非常简单,因为我们从题目中一眼就能看到函数递归的规律。直接根据题目给定条件就能写出代码。但是考查递归的问题并非所有的题目都是这么简单的,有一些题目的递归调用的规律是需要我们自己总结出来的。
我们看下面这道题目:
已知函数
计算f的值。
输入格式
输入 x 和 n。
输出格式
函数值,保留两位小数。
输入样例
4.2 10
输出样例
3.68
这道题目我们从表面上看好像很麻烦,但是如果我们从n=1开始一层层试,会发现它的规律非常明显:
……
由此可以得出递归的公式:
得到公式后我们就可以非常容易得到代码:
from math import sqrt
def f(x, n):
if n == 1:
return sqrt(1 + x)
else:
return sqrt(n + f(x, n-1))
t = input().split()
x = float(t[0])
n = int(t[1])
print(round(f(x, n), 2))
本文介绍了阿克曼函数A(m,n)的递归定义,并提供了Python实现。通过一道简单的递归调用题目,阐述如何根据递推关系建立代码,同时讨论了递归解题的一般思路,引导读者掌握递归调用的技巧。"
106420068,9274299,前端检查URL必须以http或https开头,"['前端开发', 'JavaScript', 'Vue.js', 'HTML']
:阿克曼函数&spm=1001.2101.3001.5002&articleId=128608445&d=1&t=3&u=965afc62d41b4ea3a08155b9b4d1fc83)
2152

被折叠的 条评论
为什么被折叠?



