【问题标题】:Finding multiples using recursion使用递归查找倍数
【发布时间】:2019-01-14 17:56:08
【问题描述】:

给定 1 到 100 个数字,对于 3 的倍数,它应该打印“he”,对于 5 的倍数,它应该打印“llo”,对于 3 和 5 的倍数,它应该打印“hello”。

这就是我所拥有的:

for i in range (1,100):
if(i%3==0):
    print("he")
elif(i%5==0):
    print("llo")
elif(i%3==0 and i%5==0):
    print("hello")

我将如何递归地执行此操作?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您的代码和 15 只打印“他” - 并非所有 3 ...似乎都是错误的,i%5==5 根本不可能 ...
  • @PatrickArtner 你是对的。显示的条件未按正确顺序检查。
  • @PatrickArtner 你说得对,我的意思是 i%5==0。还会错吗?
  • @Miraclefruit 一个问题是,正如@PatrickArtner 指出的那样,15 应该说“你好”,但它没有因为它去了第一个 if 语句,if( 15 % 3 == 0): 它是它会打印出“他”并退出整个 if 语句,而不检查是否可能是 5 的倍数。顺序需要不同。

标签: python recursion fizzbuzz


【解决方案1】:

下面的代码怎么样?

def find_multiples(current, last_num=100):

    # Base Case
    if current > last_num:
        return

    result = ""

    if current % 3 == 0:
        result += "he"

    if current % 5 == 0:
        result += "llo"

    if result:
        print(f"{current}: {result}")

    find_multiples(current+1, last_num)

find_multiples(1)

基本情况是current 达到last_num 或您要检查的最大数量。

【讨论】:

  • 有道理!我以前从未见过 print(f"{current}: {result}") 。所以这个语法只取与 current? 关联的结果?
  • 您的内部递归调用 find_multiples(current+1) 应该是 find_multiples(current+1, last_num) 否则对 find_multiples(1, 10) 的外部调用将改为 100。
【解决方案2】:

下面是在 python 中做简单递归事情的大致大纲:

BASE_CASE = 1 #TODO

def f(current_case):
    if current_case == BASE_CASE:
        return #TODO: program logic here
    new_case = current_case - 2 #TODO: program logic here ("decrement" the current_case somehow)
    #TODO: even more program logic here
    return f(new_case) + 1 #TODO: program logic here

当然,这并不能处理所有可能的递归程序。但是,它适合您的情况以及许多其他情况。您将调用f(100)100 将是current_value,您检查是否已经到达底部,如果是,则在调用堆栈中返回适当的值。如果不是,则创建一个新案例,在您的案例中,它是通常由“循环”构造处理的“递减”逻辑。然后,您为当前案例做一些事情,然后在新案例上再次调用该函数。这种重复的函数调用使其“递归”。如果您在函数的开头没有“if then”来处理基本情况,并且在函数中的某个地方调用“较小”值的函数,那么您可能会在递归方面遇到麻烦.

【讨论】:

    【解决方案3】:

    这个递归函数打印一个数字的倍数!希望对你有帮助


    def multi(n,x):
        if x == 12:
            print(n*x)
        else :
            print(n*x,end =",")
            multi(n,x+1)
    print(multi(4,1));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2016-08-09
      相关资源
      最近更新 更多