簡體   English   中英

C 中的遞歸:為什么我的簡單代碼不起作用?

[英]Recursion in C: why does my simple code doesn't work?

給定i的值 3,輸出應該是3/(3+1) + 2/(2+1) + 1/(1+1)的總和,總是停在 1 上。

我似乎無法弄清楚我所做的事情有什么問題,謝謝您的關注。

#include <stdio.h>
#include <math.h>

int sum_recur(int i) {
    if (i > 1) {
        return sum_recur(i - 1) / (sum_recur(i - 1) + 1);
    } else {
        return 1;
    }
}

int main(void) {
    int i;
    printf("Inform a number:\n");
    scanf("%d", &i);
    printf("%d \n", sum_recur(i));
}

我認為這將是您公式的正確遞歸實現

int sum_recur(int i){
    if(i >= 1){
        return (i / (i + 1)) + sum_recur(i-1);
    } else{
        return 0;
    }
}

此外,正如@atirit 所提到的,您應該考慮將輸出設為floatdouble以保留除法結果的浮點值。 否則, sum_recur的結果將始終為 0,因為對於整數類型, i / (i + 1)始終為 0

#include <stdio.h>
#include <math.h>

float sum_recur(int i){
    if(i >= 1){
        return (i / (i + 1.0)) + sum_recur(i-1);
    } else{
        return 0;
    }
}

int main(void){
    int i;
    printf("Inform a number:\n");
    scanf("%d",&i);
    printf("%f \n",sum_recur(i));
}

這是我相信您正在嘗試實現的內容,不需要遞歸,但如果您需要它,它就在那里:

#include <stdio.h>

double sum_recur(double i) {
    if (i < 1) return 0;
    return i / (i + 1) + sum_recur(i - 1);
}

double sum_iter(double i) {
    double sum = 0;
    for (; i >= 1; i--) {
        sum += i / (i + 1);
    }
    return sum;
}

int main(void) {
    int i;
    printf("Inform a number:\n");
    scanf("%d", &i);
    printf("%f \n", sum_iter((double) i));
    printf("%f \n", sum_recur((double) i));
}

總結是這樣的:

  • 不需要math庫。
  • 在代碼本身和printf使用floatdouble而不是int
  • 更正遞歸中的邏輯。
  • 它可以很好地迭代解決。

我不明白你想通過這段代碼實現什么。 您編寫的代碼將始終返回 2。

sum_recur將始終停在 1 處,您的 return 語句將計算 1/1+1,即始終為 2。對於輸入 3, sum_recur將生成以下內容:

sum_recur達到 1,因此為輸入值 2 返回 1

1/1 + 1 = 2,所以對於 i=2 sum_recur將再次返回 2

這將對任何輸入數字進行。 這就是為什么無論輸入是什么,此遞歸的輸出始終為 2。此外,如果您在遞歸調用之間使用除法,則您期望此函數在問題陳述中執行的操作是不可能的。 您想要實現的結果只是 2 n 次的加法或 2 與 n 的乘法。

這里寫的答案很好地解釋了這個問題,我只是想在你的代碼中特別添加一點,當你做 f(i-1)/f(i-1)+1 時,這是一種很糟糕的方法,而且如果種子輸入較大,這可能會導致 stackoverflow 出現運行時問題。 所以我建議你應該嘗試一些更有效的方法,如果你必須使用回避。 像這樣通過存儲 fun 調用值

int n = f(i-1); 返回 n/n +1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM