2015-09-20 4 views
-4

Разработка рекурсивного алгоритма для замены каждого экземпляра одного целого числа в целом. Например, с учетом входов [1, 2, 1, 3], 1 и 39 алгоритм возвращает [39, 2, 39, 3].Рекурсивный алгоритм для замены каждого экземпляра одного заданного целого числа в списке целых чисел

Я знаю, как решить проблему, если я добавлю дополнительный аргумент, который содержит подсчет текущего индекса в массиве, но можно ли разрешить использование только трех аргументов, упомянутых выше? Мне больше всего нравится psuedocode, javacsript или java-ответ.

ответ

0

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

function replace(arr, x, y) { 
    if (!arr.length) return []; 
    var val = arr[0]; 
    if (val === x) val = y; 
    return [val] . concat(replace(arr.slice(1), x, y)); 
} 

Немного привлекательнее в ES6:

function replace([head, ...tail], x, y) { 
    return head === undefined ? [] : [head === x ? y : head, ...replace(tail, x, y)]; 
} 

Если вы не возражаете внутреннюю функцию:

function replace(arr, x, y) { 
    return function _replace([head, ...tail]) { 
    return head === undefined ? [] : [head === x ? y : head, ..._replace(tail)]; 
    }(arr); 
} 
+0

Это для академических упражнений. –

0

Это не рекурсивный, но карта (JavaScript) будет делать трюк:

myArray.map(function(d){ return d == 1 ? 39 : d}) 
+0

Я ищу рекурсии –

+0

@ DanielKobe - Он отвечает вашим требованиям решения проблемы, используя только три входа. Итак, вы специально хотите применить одну и ту же функцию, элемент за элементом, вместо того, чтобы применять одну и ту же функцию к каждому элементу в списке сразу? – leroyJr

+0

Я хочу рекурсивный алгоритм, как указано в названии. –

Смежные вопросы