Рекурсивно объединить два целых числа - PullRequest
1 голос
/ 10 января 2011

Мне нужно написать функцию, которая получает два натуральных числа и возвращает их объединенными.

Пример: Cat (12,13) ​​возвращает 1213

Я знаю, как сделать это итеративным способом, это будет примерно так:

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

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

     return num1 + num2;
}

Но когда я использую рекурсию, я не могу использовать временную переменную, которая будет использоваться для подсчета цифр, и если я использую параметр, я потеряю его значение.

Ответы [ 9 ]

1 голос
/ 10 января 2011

Это не «реальная жизнь», не так ли? В любом случае вот мое предложение (рекурсивное и без третьего параметра)

int Cat(int num1, int num2)
{
    if(num2 > 0)
    {
        num1 = Cat(num1*10,num2/10);
    }
    return num1 - num2/10 + num2;
}
1 голос
/ 10 января 2011

Вы можете добавить третий параметр, который будет действовать как своего рода счетчик:

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)
}
1 голос
/ 10 января 2011

Вам нужна ваша рекурсивная процедура для обработки одной цифры за раз, поэтому цепочка вызовов будет выглядеть следующим образом:

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);
    }
}
0 голосов
/ 27 июня 2011

Вот как это было бы решено в Схеме:

(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;
}
0 голосов
/ 10 января 2011

Зачем делать это с рекурсией?

Код на python:

from math import log
def concat(a,b):
    return a * 10 ** int(log(b,10)+1) + b
0 голосов
/ 10 января 2011
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);
}
0 голосов
/ 10 января 2011

Чтобы кодифицировать сказанное MrGlass, почему бы не использовать этот код:

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

    return Integer.parseInt(s1+s2);
}

0 голосов
/ 10 января 2011

Я не уверен, что вы выполняете это упражнение как домашнее задание - в этом случае то, что я собираюсь сказать, может не сработать для вас.

Но при условии, что вы не разместите повторноваш домашний вопрос в Интернете, и вам просто нужно это сделать, вы просто рассмотрели:

  • объединение двух целых чисел в строку в записи функции
  • приведение его обратно кцелое число при выходе из функции, например

(в псевдокоде Java)

int cat(int x, int y) {
 String s = x+""+y;
 return Integer.parseInt(s);
}
0 голосов
/ 10 января 2011

Какой язык вы используете?Вы можете просто привести их как строки и соединить их таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...