1

コラッツの予想の問題をシミュレートしているときに、再帰でカウント数を出力したいときに再帰を作成しましたが、必要な結果が得られますが、関数が結果を返すと、奇妙な数が得られます。それはなぜですか?

#include <stdio.h>
#include <stdlib.h>

int divide(int n,int count){

    if(n<=1){printf("%d ",count);return count;} 

    if(n%2==1){divide(n=3*n+1, ++count);}
    else{divide(n/=2, ++count);}
}
int main(void) {  
    printf("%d ",divide(10,1)); 
    return 0;
}
4

3 に答える 3

10

デフォルトはありませんreturn。したがって、戻り値は未定義です。

于 2012-12-23T12:15:34.433 に答える
8

再帰呼び出しの結果を返す必要があります。

if (n % 2) { return divide(3 * n + 1, count + 1); }
//           %%%%%%
else       { return divide(n / 2, count + 1); }

ローカル変数に割り当てる意味がないことに注意してください。そのため、これを単純な計算に変更しました。

于 2012-12-23T12:19:43.500 に答える
3

A.再帰呼び出しからの戻り値を返す必要があります。B.分割するための呼び出しで、
なぜ値を割り当てるのですか?n

#include <stdio.h>
#include <stdlib.h>

int divide(int n,int count){

    if(n<=1){printf("%d ",count);return count;} 

    if(n%2==1)
    {
        return divide(3*n+1, ++count);
    }
    else
    {
        return divide(n/2, ++count);
    }
}
int main(void) {  
    printf("%d ",divide(10,1)); 
    return 0;
}
于 2012-12-23T12:21:33.497 に答える