2011-01-09 3 views
1

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

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

Я знаю, как сделать это итерационный способ, это будет что-то вроде этого:

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

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

    return num1 + num2; 
} 

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

+4

Если вы хотите, чтобы рассматривать числа как строки , затем используйте строки. «Конкатенация» - это не то, что вы делаете ** с целыми числами. Во-первых, «целое число» - это понятие, которое существует отдельно от того, как оно представлено. «Тринадцать» - это то же самое, независимо от того, на какой базе вы его записываете, или если вы представляете его с 13 знаками отметки или путем рисования полностью выдуманного символа, который вы затем произносите, представляет это значение. –

+1

Зачем вам его рекурсивно писать? Это домашнее задание? Какой язык? что ты уже испробовал? – templatetypedef

+0

Потому что именно так задан вопрос. Это не совсем домашнее задание. И этот язык не имеет значения, поскольку он больше связан с алгоритмом. Я думал о решении с дополнительным параметром, но я ищу что-то только с двумя параметрами. – Ben

ответ

0

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

0

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

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

  • комбинируя два целых числа в строку на входе функции
  • литье его обратно в целое число на выходе функции

, например (в псевдокоде Java)

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

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

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) 
} 
+0

Я, хотя из этого решения. Но есть ли способ к этому без дополнительного параметра? – Ben

+0

@Ben: Вы можете непосредственно рассчитать первую цифру числа, используя логарифмы и так далее. Зачем тебе это? –

0

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

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

    return Integer.parseInt(s1+s2); 
} 

?

0
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

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

кода в Python:

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

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

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); 
    } 
} 
1

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

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

Это, как она была бы решена в схеме:

(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; 
} 
Смежные вопросы