2015-10-27 5 views
1

Дано массив длины n, а также требование, чтобы написать программу стоимостьчисло суб-последовательностей длины m этого заданного массива.Получение справки программирование рекурсивное С

Ниже приведен код для этого. Пожалуйста, посмотрите.

int recCountSubseq(int seqLength, int length, int s[]) { 
    int answer; 

    if (seqLength == 0) {  /* Base case: found a subseq of correct length */ 
     return 1; 
    } 

    if (seqLength >= length) { /* Base case: only possible is seqLength == length*/ 
     return (seqLength==length); 
    } 

    /* Recursive case: two branches */ 
    answer = recCountSubseq(seqLength-1, length-1, s); /* s[length-1] is in subseq*/ 
    printf("answer=%d\n", answer); 

    answer += recCountSubseq(seqLength, length-1, s); /* s[length-1] is not in subseq */ 
    printf("increased answer is %d\n", answer); 

    return answer; 
} 

void countSubseq(int seqLength, int length, int s[]) {  
    printf("#subseq = %d\n", recCountSubseq(seqLength, length, s));  
} 

int main() { 
    int length; 
    scanf("%d", &length); 

    int seqLength; 
    int i; 
    int s[100]; 

    for (i=0;i<length; i++) { 
     scanf("%d", &s[i]); 
    } 

    countSubseq(seqLength, length, s); 

    return 0; 
} 

Теперь мой вопрос: Почему значение seqLength уменьшается каждый раз, и как именно работает этот код?

+0

В вас деле, 'seqLength' должен в конечном счете будет '0', так что рекурсивный вызов' recCountSubseq' прекращается. –

+4

'seqLength' не был инициализирован. Код нарушен и не может быть аргументирован. – user694733

+0

если вы пытаетесь скомпилировать его, он работает и дает количество эльфов в массиве, как я нашел, но я не понимаю, почему seqLength уменьшается –

ответ

2

Функция имеет неопределенное поведение, потому что по крайней мере, переменная seqLength не был инициализирован:

int seqLength; 

И задача не ясна. Если у вас есть массив с n элементами, то число непрерывных подпоследовательностей длины m, где равно n - m + 1.

Так писать такую ​​функцию не имеет большой смысл. :) Кроме того, я не вижу, даже если в функции есть доступ к массиву, переданный в качестве третьего аргумента. :)

Insetad я могу предложить вы выполните следующую функцию. По крайней мере, это имеет какой-то смысл. :)

#include <stdio.h> 

size_t recCountSubseq(const int a[], size_t n, size_t m) 
{ 
    if (m <= n) 
    { 
     for (size_t i = 0; i < m; i++) printf("%d ", a[i]); 
     printf("\n"); 
    } 

    return n <= m ? n == m : 1 + recCountSubseq(++a, --n, m); 
} 

int main(void) 
{ 
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    printf("There are %zu subsequencies\n", recCountSubseq(a, sizeof(a)/sizeof(*a), 3)); 

    return 0; 
} 

Его выход

1 2 3 
2 3 4 
3 4 5 
4 5 6 
5 6 7 
6 7 8 
7 8 9 
There are 7 subsequencies 

Я думаю, что вы неправильно ИНТЕРПРЕТАЦИОННОЕ назначение и ее решение. Вы должны проверить их описания заново.

+0

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

+0

@NatiaEbralidze Что касается я не совсем понимаю, что делает код. :) Не могли бы вы описать назначение функции? –

+0

@NatiaEbralidze Вы грузины? :) –

0

С моей точки зрения, вам нужно получить от пользователя длину подпоследовательности, которая не выполняется в вашем коде.

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

int main(array<System::String ^> ^args) 
{ 
    int length; 

    printf("Length of array:"); 
    scanf("%d", &length); 

    int seqLength; 

    printf("Length of sub-seq:"); 
    scanf("%d", &seqLength); 

    int i; 
    int s[100]; 

    printf("Array of %d elements:", length); 
    for (i=0;i<length; i++) 
    { 
    scanf("%d", &s[i]); 
    } 

    countSubseq(seqLength, length, s); 

    return 0; 
} 
+0

Зачем это нужно? –

+0

Если задача состоит в том, чтобы написать функцию, которая «вычисляет количество подпоследовательностей с длиной m из массива с заданной длиной n», вы должны сообщить своей функции, что есть * m * и * n *. Вы уже получаете * n * (длина), и вы должны получить * m * (seqLength), а также – Lelo

+0

, что вы говорите, что оно должно быть задано прогамой. Я не уверен, дорогая. Я действительно не получаю вопрос, я думаю, –

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