【问题标题】:Recursively concatenate two integers递归连接两个整数
【发布时间】:2011-06-06 05:23:58
【问题描述】:

我需要编写一个函数,它接收两个正整数并将它们连接起来。

示例:Cat(12,13)​​ 返回 1213

我知道如何以迭代的方式做到这一点,它会是这样的:

int Cat(int num1, int num2)
{
     int temp = num2;

     while (temp > 0)
     {
         num1 *= 10;
         temp /= 10;
     }

     return num1 + num2;
}

但是当我使用递归时,我不能使用将用于计算数字的临时变量,如果使用参数我将失去它的值。

【问题讨论】:

  • 如果要将数字视为字符串,请使用字符串。 “连接”不是你用整数做的事情。一方面,“整数”是一个与数字表示方式分开存在的概念。 “十三”无论你写在什么基础上,或者你用 13 个计数标记来表示它,或者通过绘制一个完全虚构的符号,然后你说它代表那个值,都是一样的。
  • 为什么需要递归写?这是作业吗?什么语言?到目前为止,您尝试过什么?
  • 因为这就是问题的定义方式。这不完全是家庭作业。语言并不重要,因为它更多的是关于算法。我想到了带有额外参数的解决方案,但我正在寻找只有两个参数的解决方案。
  • 这看起来很像“计算机程序的结构和解释”中的练习。
  • 您当然可以使用参数计算数字。为此,您需要 两个 函数。

标签: c string recursion


【解决方案1】:

您使用什么语言?您可以简单地将它们转换为字符串并以这种方式连接它们。

【讨论】:

    【解决方案2】:

    我不确定您是否将这项练习作为家庭作业进行 - 在这种情况下,我要说的内容可能不适合您。

    但假设你不会将你的家庭作业问题重新发布到网络上,而你只需要完成这个,你是否简单地考虑过:

    • 在函数入口将两个整数组合成一个字符串
    • 在函数退出时将其转换回整数

    例如(在 Java 伪代码中)

    int cat(int x, int y) {
     String s = x+""+y;
     return Integer.parseInt(s);
    }
    

    【讨论】:

      【解决方案3】:

      您可以添加第三个参数作为一种计数器:

      int Cat2(int num1, int num2, int x)
      {
           if (x == 0) 
           {
               return num1 + num2;
           }
           else 
           {
               return Cat(num1 * 10, num2, x / 10);
           }
      }
      
      int Cat(int num1, int num2)
      {
           Cat2(num1, num2, num2)
      }
      

      【讨论】:

      • 我想到了这个解决方案。但是没有额外的参数有没有办法呢?
      • @Ben:你可以直接用对数等计算数字的第一位。为什么需要它?
      【解决方案4】:

      要整理 MrGlass 所说的内容,为什么不使用此代码:

      int Cat(int n1, int n2){
          String s1 = Integer.toString(n1);
          String s2 = Integer.toString(n2);
      
          return Integer.parseInt(s1+s2);
      }
      

      ?

      【讨论】:

        【解决方案5】:
        int do_cat(int num1, int num2, int temp)
        {
            return temp? do_cat(num1 * 10, num2, temp / 10): num1 + num2;
        }
        
        int cat(int num1, int num2)
        {
            return do_cat(num1, num2, num1);
        }
        

        【讨论】:

          【解决方案6】:

          为什么要用递归呢?

          python中的代码:

          from math import log
          def concat(a,b):
              return a * 10 ** int(log(b,10)+1) + b
          

          【讨论】:

            【解决方案7】:

            您需要递归例程一次处理一个数字,因此调用链如下所示:

            Cat(12, 13)
            Cat(121, 3)
            Cat(1213, 0) <- at this point the recursion terminates, since num2 == 0
            

            所以你的函数看起来像这样:

            int Cat(int num1, int num2)
            {
                if (num2 == 0)
                {
                    return num1;
                }
                else
                {
                    // remove most significant digit from num2 and
                    // append it to num1
                    return Cat(num1, num2);
                }
            }
            

            【讨论】:

              【解决方案8】:

              这不是“现实生活”中的任务,是吗?无论如何,这是我的提议(递归且没有第三个参数)

              int Cat(int num1, int num2)
              {
                  if(num2 > 0)
                  {
                      num1 = Cat(num1*10,num2/10);
                  }
                  return num1 - num2/10 + num2;
              }
              

              【讨论】:

                【解决方案9】:

                这就是它在 Scheme 中的解决方式:

                (define (Cat num1 num2)
                    (define (CatLoop num1 num2 temp)
                            (if (= temp 0)
                                (+ num1 num2)
                                (CatLoop (* num1 10) num2 (/ temp 10))))
                    (CatLoop num1 num2 num2))
                

                [可能包含语法错误,我没有测试。]

                在具有嵌套函数的类 C 语言中:

                int Cat(int num1, int num2) {
                    int CatLoop(int num1, int num2, int temp) {
                        if (temp == 0)
                            return num1 + num2;
                        else
                            return CatLoop(num1 * 10, num2, temp / 10);
                    }
                
                    return CatLoop(num1, num2, num2);
                }
                

                在尾调用优化之后,这将展开为以下内容:

                int Cat(int num1, int num2) {
                    int temp = num2;
                    // goto CatLoop;
                
                    CatLoop:
                    if (temp == 0)
                        goto Done;
                
                    Else:
                    num1 *= 10;
                    temp /= 10;
                    goto CatLoop;
                
                    Done:
                    return num1 + num2;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多