我撰寫了以下代碼以使用遞回函式查找數字是偶數還是奇數。
#include <stdio.h>
#include <stdlib.h>
int posneg(int n){
if (posneg(n-1)%2 == 0){
return 1;
}
else {
return 0;
}
}
main () {
int num;
do{
printf("Provide a number");
scanf("%d",&num);
} while (num <= 0);
if (posneg(num) == 1)
printf("The number is even");
else
printf("The number is odd");
}
代碼編譯成功,但出現分段錯誤。
任何想法是什么原因?
uj5u.com熱心網友回復:
確定一個數是偶數還是奇數的函式不太適合遞回實作,除非目的是說明遞回通常不是理想的解決方案。
遞回解決方案必須有一個基本情況,否則它將繼續呼叫自己,直到系統耗盡資源并且程式崩潰。
我們如何遞回地確定一個數是偶數還是奇數?一種方法是逐漸從數字中添加或減去兩個,直到我們達到 -1、0 或 1(我們的基本情況):
// Let's say a return value of '1' means odd and '0' means even
int evenodd (int n)
{
if(-1 == n || 1 == n) // base case: n is odd
{
return 1;
}
else if(0 == n) // base case: n is even
{
return 0;
}
else
{
return evenodd(n > 0 ? n-2 : n 2);
}
}
uj5u.com熱心網友回復:
您收到分段錯誤,因為您的代碼導致堆疊溢位。
int posneg(int n){
if (posneg(n-1)%2 == 0){
return 1;
}
else {
return 0;
}
}
每次遞回函式呼叫自身時,都會將一個新的活動記錄添加到包含新呼叫引數的堆疊中。
這個遞回函式永遠不會對基本情況進行評估,因為它必須確定它是否可以被 2 整除,為了做到這一點,您必須呼叫該函式來評估它。重復此操作,直到您的程式用完堆疊為止。
uj5u.com熱心網友回復:
對于根據 C 標準的初學者,不帶引數的函式 main 應宣告為
int main( void )
您不能省略函式的回傳型別。
其次,如果您期望一個非負數,那么將變數宣告num為具有該型別并沒有多大意義int。變數應宣告為具有型別unsigned int。
由于函式內部的 if 陳述句,該函式產生無限遞回
int posneg(int n){
if (posneg(n-1)%2 == 0){
return 1;
}
else {
return 0;
}
}
使用您定義函式的方法,它可以按照以下方式查找,如下面的演示程式所示
#include <stdio.h>
int posneg( unsigned int n )
{
return ( n == 0 ) || ( ( 1 posneg( n - 1 ) ) % 2 );
}
int main( void )
{
while ( 1 )
{
printf( "Provide a non-negative number (0 - exit): " );
unsigned int n;
if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
if ( posneg( n ))
{
printf( "The number %u is even.\n", n );
}
else
{
printf( "The number %u is odd.\n", n );
}
}
}
程式輸出可能看起來像
Provide a non-negative number (0 - exit): 1
The number 1 is odd.
Provide a non-negative number (0 - exit): 2
The number 2 is even.
Provide a non-negative number (0 - exit): 3
The number 3 is odd.
Provide a non-negative number (0 - exit): 4
The number 4 is even.
Provide a non-negative number (0 - exit): 5
The number 5 is odd.
Provide a non-negative number (0 - exit): 6
The number 6 is even.
Provide a non-negative number (0 - exit): 7
The number 7 is odd.
Provide a non-negative number (0 - exit): 8
The number 8 is even.
Provide a non-negative number (0 - exit): 9
The number 9 is odd.
Provide a non-negative number (0 - exit): 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376314.html
下一篇:使用遞回MySQL插入唯一的亂數
