将f(0)= 1和f(n)定义为不同方式的数量n可以表示为2的整数幂之和,每次幂不超过两次。例如,f(10)=因为有五种不同的表达方式10:
给定n的f(n)是什么,你可以使用任何计算机语言。
import math
def powOfTwo(n):
i=0
while(pow(2,i)<=n):
if (pow(2,i)==n):
return True
else:
i=i+1
return False
def noWays(n):
if n==1:
return 1
elif n==0:
return 0
else:
if (n%2==0):
if (powOfTwo(n-2) and n-2!=2):
return (1+noWays((n-2)/2)+noWays(n/2))
else:
return (noWays((n-2)/2)+noWays(n/2))
else:
if (powOfTwo(n-1)and n-1!=2):
return (1+noWays((n-1)/2))
else:
return (noWays((n-1)/2))
n=int(input())
v=noWays(n)
print(v)
答案 0 :(得分:1)
通常,对于这些类型的谜题,您只需要以不同的方式提出问题。
给定起始编号,通过减去2的幂,可以将多少种方法转换为零?您可以将每个数字减去零,一次或两次。
使函数签名采用以下参数:
算法如下所示。 (在手稿中)
function pathsToZero(n: number, p:number) : number {
if(n === 0) {
// We've hit the target!
return 1;
}
if(n < p) {
// This will only be negative. No point in continuing
return 0;
}
return pathsToZero(n, p*2) + pathsToZero(n-p, p*2) + pathsToZero(n-p*2, p*2);
}
let resultForTen = pathsToZero(10, 1);