2017-09-18 418 views
1

我正在練習遞歸,並且我對該問題的解決方案似乎不起作用。 我想寫一個遞歸的代碼,將確定一個數字的數字是否升序或不。這裏是我的代碼:確定數字的數字是否遞增的遞歸函數

#include <stdio.h> 
int isAscending(int num); 
int main(){ 
    int result; 
    result = isAscending(123);//Should print "The number is in ascending order!" 
    if (result == 0) { 
     printf("The number is in ascending order!\n"); 
    } 
    else { 
     printf("The number is not in ascending order!\n"); 
    } 
} 
int isAscending(int num) { 
    int new = num/10; 
    int result = 0; 
    if ((num % 10) == 0) { 
     return 0; 
    } 
    else if ((num % 10) > (new % 10)) { 
     result += isAscending(num/10); 
     return result; 
    } 
    else { 
     return 1; 
    } 
} 
+1

所以。這是什麼意思「似乎不起作用」?你爲什麼終止如果一個數字是'0'? –

+0

通常遞歸函數自我調用。我在你的'isAscending(...)' – cleblanc

+1

中看不到這些。另外,你爲什麼要添加結果? –

回答

0

能否請您嘗試以下recurrsive代碼:

`

boolean isascending(int num){ 

if(num == 0) return true; 
if(num%10>num%100) return isascending(num/10); 
else return false; 
}` 

,或者你可以使用while循環:

while(num>0){ 
if(num%10 > num%100){ 
    num = num/10; 
    continue; 
} return false; 
} return true; 
+0

OP將這個問題標記爲'C'。你的程序不完整/不會按原樣運行。 – babon

+0

兩次都失敗了各種測試。你可能想要審查/測試。 – chux

0

這將是更好的使用另一個參數來存儲最後一位數字,該數字在當前迭代中將被「丟棄」。

於是我想出了下面的遞歸的邏輯:

  • 使用它存儲的最後一位數字下降

    參數
  • 基本情況:如果數字爲0,return 0true

  • 計算當前數字的最後一位數(數字%10)

  • 如果當前的最後一個數字大於最後一個數字下降:是這樣的情況下,return 1false

  • 如果沒有,在新的數字下降爲當前的上次數字返回isAscendingRecursive()並把它作爲下一次迭代最後一位數字

代碼:

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

int main(int argc, char** args){ 
    int num=0; 
    printf("Insert a number:\n"); 
    scanf("%d",&num); 
    if(isAscending(num)==0) 
     printf("Ascending\n"); 
    else 
     printf("Not ascending\n"); 
} 

int isAscending(int num){ 
    return isAscendingRecursive(num,9); 
} 

int isAscendingRecursive(int num, int lastDigit){ 
    if(num == 0) 
     return 0; 

    int temp = num%10; 
    if(temp > lastDigit) 
     return 1; 
    else 
     return isAscendingRecursive(num/10, temp); 
} 
-1

我固定我的代碼和它的作品,感謝您的幫助!:

#include <stdio.h> 
int isAscending(int num); 
int main(){ 
    int result; 
    result = isAscending(2589);//Should print "The number is in ascending order!" 
    if (result == 0) { 
     printf("The number is in ascending order!\n"); 
    } 
    else { 
     printf("The number is not in ascending order!\n"); 
    } 
} 
int isAscending(int num) { 
    int new = num/10; 
    int result = 0; 
    if ((num % 10) == 0) { 
     return 0; 
    } 
    else if ((num % 10) > (new % 10)) { 
     return isAscending(num/10); 
    } 
    else { 
     return 1 + isAscending(num/10); 
    } 
} 
+0

此答案不正確地報告'10,20,101等'是遞增的。同樣,'isAscending()'在從函數名稱向後發出的升序時返回零。 'int result = 0;'沒有任何價值。 – chux

+0

爲什麼你爲'0'返回'0'? – chqrlie

2

下面是另一個(裸機)的方式去了解它。基本的想法是,如果我們有一位數字,我們返回肯定的,否則我們檢查最右邊的數字是否大於僅剩下的數字。我們爲剩下的數字做這個。

#include <stdio.h> 

int isAsc(int i) 
{ 
    int rem = i % 10; // remainder 
    int quo = i/10; // quotient 

    if (rem == i) 
     return 1; 
    else if (rem <= (quo % 10)) 
     return 0; 
    else 
     return 1 && isAsc(quo); 
} 

int main(void) 
{ 
    int i = 123123; 
    if (isAsc(i)) 
     printf("%s\n", "Ascending"); 
    else 
     printf("%s\n", "Not ascending"); 

    return 0; 
} 
+0

請注意'isAsc(-123)'返回0.不清楚OP如何處理負值。 – chux

+0

可以簡化'return 1 && isAsc(quo);' - >'return isAsc(quo);' – chux

+0

@chux是的,我不知道如何處理負值,因此「裸骨」:)。是的,它可以被簡化,但有點想像所有的結果正在通過'&&'運行,並返回最終結果。 – babon

0

該解決方案在失敗時返回0,否則返回成功的其他整數。看來,isDescending()更容易返回0作爲失敗值時寫的,但我這個扭曲相應:

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

int isAscending(int num) { 
    int quotient = num/10; 
    int remainder = num % 10; 

    if (quotient != 0) { 

     int result = isAscending(quotient); 

     if (result == 0 || result >= remainder) { 
      return 0; 
     } 
    } 

    return remainder; 
} 

int main(int argc, char **argv) { 
    if (isAscending(atoi(argv[1]))) { 
     printf("The number is in ascending order!\n"); 
    } else { 
     printf("The number is not in ascending order!\n"); 
    } 

    return 0; 
} 

試驗

% ./a.out 123 
The number is in ascending order! 
% ./a.out 321 
The number is not in ascending order! 
% ./a.out 101 
The number is not in ascending order! 
% 

不,它不處理負數!它也不能正確處理'0'作爲輸入 - 其他單個數字的數字沒有問題。

再次,isDescending()更容易編寫但不幸的是,!isDescending()!= isAscending()

0

你的測試是不正確的。如果最後一位是小於或等於前一個遞歸的休息,你應該對數字返回true用一個單一的數字,假:

int isAscending(int num) { 
    int new = num/10; 

    if (new == 0) { 
     return 1; 
    } else 
    if (num % 10 <= new % 10) { 
     return 0; 
    } else { 
     return isAscending(new); 
    } 
} 

這種遞歸被稱爲尾遞歸你返回結果的遞歸調用。好的編譯器會生成相當於此的迭代代碼:

int isAscending(int num) { 
    for (;;) { 
     int new = num/10; 

     if (new == 0) { 
      return 1; 
     } 
     if (num % 10 <= new % 10) { 
      return 0; 
     } 
     num = new; 
    } 
}