2016-02-22 3 views
1

У меня проблема: я хочу создать рекурсивную функцию для вычисления всех возможностей иметь число (k> 0), с добавлением числа 1 или 2. Пример для числа 2 у меня есть два возможных. 2 = 1 + 1 и 2 = 2, для номера 3 - два. 3 = 1 + 1 + 1 или 3 = 1 + 2. У меня есть эта идея, но она не работает.Javascript recursive

function op(k, n, i) { 
    if (n == k) { 
     return i++; 
    } else if (n > k) { 
     return i; 
    } else { 
     n = n + 1; 
     op(k, n, i); 
     n = n + 2; 
     op(k, n, i); 
    } 
} 

op(3, 0, 0); 
+7

Вы ничего не возвращаете в своем блоке 'else'. – Kevin

+1

примитивные типы передаются по значениям в параметрах функции в javascript – madox2

+0

И вы ничего не делаете с возвращаемым значением из вызовов op() в блоке else. – nnnnnn

ответ

1

Не знаете, почему вы хотите сделать это рекурсивно. Больше объяснений помогло бы с этой точки зрения. Если вы пытаетесь вернуть число раз, когда значение k может быть добавлено с использованием 1 и 2, просто возьмите базовый случай (1 + 1 + 1 + ... k раз) и добавьте конкретный случай, где 1 сгруппированы (1 + 1 + 1 + (1 + 1)), и это ваш ответ.

function op(k){ 
 
return 1 + parseInt(k/2,10); 
 
} 
 
for(var i = 1;i < 100; i++){ console.log(i+": "+op(i)); }

+0

, это хороший способ ... спасибо – Faber

0

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

} else { 
    return op(k, n+1, i) + op(k, n+2, i); 
} 

Вы вызываете функцию для добавления 1, вызовите его снова для добавления 2, а затем добавьте эти два вместе.

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

0

Разве это не просто:

function combinations(n) { 
    return 1 + (Math.floor(n/2)); 
}; 

Или я очень здесь не так? У вас есть базовый случай 1xn n = (1 + 1 + 1 + 1 ...) Затем вы можете сгруппировать все 1, например n = ((1 + 1) + 1 + 1 + 1 ...) Таким образом, вы завершаете эту общую функцию.

На каждые два 1 там есть еще одна перестановка. Это, по-видимому, справедливо для шансов и эвенов. Если я допустил ошибку, позвольте мне знать!

Редактировать: Кто-то уже решил выше, не заметил! Хорошая работа! Упрекнул вас!