# 1.使用递归输出一个数字里面有多少个8
def num_eights(num):
if num == 0:
return 0
if num % 10 == 8:
return 1 + num_eights(num // 10)
else:
return num_eights(num // 10)
# 2.输出数字距离之和
def digit_distance(num):
if num < 10:
return 0
# if 10 <= num < 100:
# return abs(num % 10 - num // 10)
else:
# return digit_distance(num % 100) + digit_distance(num // 10)
# 不能这样写,因为这样直接切两位,如果前面一个是0,会丢失信息
last_two_diff = abs(num % 10 - (num // 10) % 10)
return digit_distance(num // 10) + last_two_diff
# 3.交错求和
## 草台写法
def interleaved_sum(num, f_odd, f_even):
def interleaved_sum_help(k, num):
if k > num:
return 0
else:
return f_odd(k) + interleaved_sum_help(k+2, num)
def interleaved_sum_help_2(k, num):
if k > num:
return 0
else:
return f_even(k) + interleaved_sum_help_2(k+2, num)
return interleaved_sum_help(1, num) + interleaved_sum_help_2(2, num)
## 改良写法
def interleaved_sum(num, f_odd, f_even):
def sum_from(k):
if k > num:
return 0
elif k == num:
return f_odd(k)
else:
return f_odd(k) + f_even(k+1) + sum_from(k+2)
return sum_from(1)
# 4.计算美元数量
def next_smaller_dollar(bill):
"""Returns the next smaller bill in order."""
if bill == 100:
return 50
if bill == 50:
return 20
if bill == 20:
return 10
elif bill == 10:
return 5
elif bill == 5:
return 1
def count_dollars(sum_needed):
def count(sum_needed, bill):
if sum_needed == 0:
return 1
elif bill is None:
return 0
elif sum_needed < 0:
return 0
else:
return count(sum_needed - bill, bill) + count(sum_needed, next_smaller_dollar(bill))
return count(sum_needed, 100)
# 5.另一种计算美元方法
def next_larger_dollar(bill):
if bill == 1:
return 5
elif bill == 5:
return 10
elif bill == 10:
return 20
elif bill == 20:
return 50
elif bill == 50:
return 100
def count_dollars_upward(sum_needed):
def count(sum_needed, bill):
if sum_needed == 0:
return 1
elif bill is None:
return 0
elif bill > 100:
return 0
elif bill > sum_needed:
return 0
else:
return count(sum_needed - bill, bill) + count(sum_needed, next_larger_dollar(bill))
# 7.汉诺塔
def print_move(origin, destination):
print("Move the top disk from rod", origin, "to rod", destination)
def move_stack(num, start, end):
assert 1 <= start <= 3 and 1 <= end <= 3 and start != end, "Bad start/end"
if num == 1:
print_move(start, end)
else:
move_stack(num-1, start, 6-start-end)
move_stack(1, start, end)
move_stack(num-1, 6-start-end, end)