Как эта строка возвращает длину массива в рекурсии?

Я пытаюсь понять эту рекурсию с помощью отладчика и пытаюсь понять ее шаг за шагом, основной. Отладчик показывает smallAns возвращает размер массива я не могу понять, как этот smallAns возвращает размер массива input[]Кто-нибудь может объяснить это

 #include<iostream>
using namespace std;
int subsequences(char input[], int startIndex,char output[][50]){
if(input[startIndex] == '\0'){
output[0][0] = '\0';
return 1;
}
int smallAns = subsequences(input, startIndex+1, output);
for(int i = smallAns; i < 2*smallAns; i++){
int row = i - smallAns;
output[i][0] = input[startIndex];
int j = 0;
for(; output[row][j] != '\0'; j++){
output[i][j + 1] = output[row][j];
}
output[i][j + 1] = '\0';
}
return 2*smallAns;
}
int main(){

char input[] = "abc";
char output[100][50];
int ans = subsequences(input, 0, output);
for(int i = 0; i < ans; i++){
for(int j = 0; output[i][j] != '\0'; j++){
cout << output[i][j];
}
cout << endl;
}
}

рекурсия

watchvalue

-3

Решение

Вот что делает алгоритм:

Начните в конце с пустой подпоследовательности (или «\ 0»). У вас есть 1 подпоследовательность.

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

Повторение.

Следовательно, 2 * smallAns означает «Возьмите количество подпоследовательностей, найденных в нижнем рекурсивном вызове, и удвойте его». И это имеет смысл после того, как вы узнаете, как это было реализовано. При этом важность комментариев и документации в коде. 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector