代码之家  ›  专栏  ›  技术社区  ›  Steve Rowe

我如何在没有递归的情况下解决这个问题?

  •  4
  • Steve Rowe  · 技术社区  · 17 年前

    我想帮我儿子解一道数学题。这似乎是一个让他接触一些编程的好机会。我可以看到递归解决方案,但也许迭代解决方案更容易解释。到目前为止,他所学的语言是 SmallBasic 它不太支持递归(没有局部变量)。我并不反对教授另一种语言,但我仍然想知道是否有一种不用递归就能解决这个问题的好方法。

    问题是: 给定数字序列123456789,在数字之间插入+和-,使结果相加为101。例如,1+23+4+5+67-8+9=101。

    递归解决方案如下所示:

    next(total, number, nextNumber, sequenceString)
    {
        //add
        next(total + number, ...);
    
        //subtract
        next(total - number, ...);
    
        //do nothing (multiply)
        next(total, number * 10, ...);
    }
    

    有没有一个迭代的解决方案不是很复杂?

    6 回复  |  直到 17 年前
        1
  •  17
  •   Thomas Kammeyer    17 年前

    考虑数字1、2、3、4、5、6、7、8、9之间的空间。 有8个这样的间隙或槽。

    每个这样的空间可以用+、-或零填充(表示

    八个插槽中的每一个都有三种可能性。为三个可能的填充符指定数字,如下所示:

     0 --> +
     1 --> -
     2 --> (nothing)
    

    现在,每个8位三进制字符串对应一个解决方案。例如:

     00000000 --> 1+2+3+4+5+6+7+8+9
     00000001 --> 1+2+3+4+5+6+7+8-9
     00000002 --> 1+2+3+4+5+6+7+89
     22222222 --> 123456789
    

    将沿途的每个数字解释为如上所述的解决方案,在达到目标值101的解决方案时立即停止,或在未达到目标值的情况下结束时报告失败。

    有3^8(指数,不是xor,或3**8表示Fortranoid,或

     3*3*3*3*3*3*3*3
    

    对于可能的解决方案。只有6561;你可以很容易地用这种方法来强迫它。

        2
  •  4
  •   Mehrdad Afshari    17 年前

    递归是计算机科学中的一个重要观点。如果你这样做的目的是教你的儿子,为什么现在不给他解释递归呢

        3
  •  2
  •   Seb    17 年前

    • 添加(选项“0”);
    • 减记(选项“1”);
    • 不采取任何行动(选项“2”);

    所以基本上你有3^8个可能的解决方案;都试试看。

    这是PHP代码,但包括在其他基础上转换数字,这是一个8岁的男孩可能不会很快理解的。也许你可以找到这方面的转折点:

    <?php
    
    $limit = pow(3, 8);
    for($op = 0; $op < $limit; $op++){
      // Get this operation.
      $op_base3 = base_convert($op, 10, 3);
    
      // Fill leading 0's.
      $op_base3 = str_pad($op_base3, 8, "0", STR_PAD_LEFT);
    
      // Here you get something like 00212120, which would say:
      // 1[+]2[+]3[nothing]4[-]5[nothing]6[-]7[nothing]8[+]9
      // That's: 1+2+34-56-78+9
    
      // Compute and if result's correct, output solution.
    }
    
    ?>
    
        4
  •  1
  •   vartec    17 年前

    当然,它可以通过简单的迭代来解决。您只需将字符串转换为堆栈。

        5
  •  0
  •   Richard    17 年前

    给定递归的有限深度,数组可以用作堆栈。

        6
  •  0
  •   Rob Lachlan    17 年前

    它可以迭代完成,但远不如这简单。更重要的是,你会利用这个机会来教你儿子算法的复杂性吗?