g=[-1 for i in range(1000)]#简化递归的重复计算,创建一个表
x=int(input())
def f(x):
if x==1:
return 1
elif g[x]!=-1:#当g[x]!=-1,说明这个数已经计算过,无需重复计算
return g[x]
elif x%2==0:
g[x]=f(x-1)+f(int(x/2))
else:
g[x]=f(x-1)
return g[x]
print(f(x))
#用切片形式,来替换内容,如果不等于-1,说明此数已经计算过了,减少递归次数
题目描述
给出自然数 nn,要求按如下方式构造数列:
- 只有一个数字 nn 的数列是一个合法的数列。
- 在一个合法的数列的末尾加入一个自然数,但是这个自然数不能超过该数列最后一项的一半,可以得到一个新的合法数列。
请你求出,一共有多少个合法的数列。两个合法数列 a, ba,b 不同当且仅当两数列长度不同或存在一个正整数 i \leq |a|i≤∣a∣,使得 a_i \neq b_iai=bi。
输入格式
输入只有一行一个整数,表示 nn。
输出格式
输出一行一个整数,表示合法的数列个数。
题解
当n为偶数时,f(n)=f(n-1)+f(n/2)
当n为奇数时,f(n)=f(n-1)