问题描述:
给定一个正整数n,如果n为偶数,将n替换为n/2;如果n为奇数,将n替换为n+1或n-1,那么将n转换为1,最少的替换次数为多少?
问题示例:
输入8,输出3,即8->4->2->1;输入7,输出4,即7->8->4->2->1,或者7->6->3->2->1
代码实现:
解题思路其实就相当于因式分解,采用DFS算法
class IntegerReplace:
def integerreplace(self,n):
memo ={}
self.dfs(n,memo)
print(memo[n])
return len(memo[n])-1
def dfs(self,n,memo):
temp = []
if n in memo:
return memo[n]
if n ==1:
temp.append(1)
memo[1] = temp
return temp
if n % 2 ==0:
temp.append(n)
cur = self.dfs(n//2,memo)
temp.extend(cur)
memo[n] = temp
return temp
else:
temp2 = temp.copy()
n2 = n
temp.append(n)
cur = self.dfs((n+1),memo)
temp.extend(cur)
temp2.append(n2)
curs = self.dfs((n2-1),memo)
temp2.extend(cur2)
if len(temp) < len(temp2):
memo[n] = temp
return temp
else:
memo[n] = temp2
return temp2
if __name__ == '__main__':
slo = IntegerReplace()
n = int(input("请输入一个数字:"))
res = slo.integerreplace(n)
print(res)
结果输出:
'''
请输入一个数字:8
[8, 4, 2, 1]
3
请输入一个数字:89
[89, 88, 44, 22, 11, 10, 5, 4, 2, 1]
9
'''
有兴趣的朋友可以提升一下难道,把所有最小的替换过程打印输出_