遞歸練習

遞歸:程序調用自身,大事化小
遞歸條件:

  1. 要有限制條件,以便跳出遞歸,以防死循環
  2. 每次的遞歸調用都要接近那個限制條件

1、接受一個無符號整形值,把它轉換爲字符並打印它
例如:12345 —-> 1 2 3 4 5

//1234 5
//123 4 5
//12 3 4 5
//1 2 3 4 5
#include<stdio.h>
int fun(num)
{
    if(num>9)
    {
        fun(num/10);
    }
    printf("%d ",num%10);
}
int main()
{
    int num=12345;
    fun(num);
    return 0;
}

2、不創建臨時變量,求字符串長度

#include<stdio.h>
int Strlen(const char *str)
{
    if(*str=='\0')
        return 0;
    else
        return 1+Strlen(str+1);
}
int main()
{
    char *p="qweasd";
    int len=Strlen(p);
    printf("len=%d\n",len);
    return 0;
}

3、求N的階乘

#include<stdio.h>
int  factorial(n)
{
    if(n<=1)
        return 1;
    else
        return  n*factorial(n-1);
}
int main()
{
    int n=5;
    int ret = factorial(n);
    printf("%d\n",ret);
    return 0;
}

4、求第N個斐波那契數 1 1 2 3 5 8 13…

#include<stdio.h>
int fib(n)
{
    if(n<=2)
        return 1;
    else
        return fib(n-1)+fib(n-2);
}
int main()
{
    int n=10;
    int ret=fib(n);
    printf("%d\n",ret);
    return 0;
}

5、編寫一個指數函數,實現n^k

#include<stdio.h>
#define a 3
#define b 5
int Index(int n,int k)
{
    if(k==1)
        return n;
    else
         return n * Index(n,k -1);
}
int main()
{
    int n=a;
    int k=b;
    printf("%d\n",Index(n,k));
    return 0;
}

6、寫一個遞歸函數DigitSum(n),輸入一個非負整數,返回組成它的數字之和,
例如,調用DigitSum(2017),則應該返回2+0+1+7,它的和是10

#include<stdio.h>
int DigitSum(int n)
{
    if(n<10)
        return n;
    else
        return ((n % 10) + DigitSum(n / 10));
}
int main()
{
    int num=2017;
    int ret=DigitSum(num);
    printf("ret=%d\n",ret);
    return 0;
}

模擬遞歸
7、整數n的數字根如下定義:它是一個整數的所有數字的和,反覆相加,直到只剩下一位數字爲止:

  1. 2018—–>2+0+1+8=11
  2. 11 —–>1+1=2
#include<stdio.h>
int DigitalSum(int n)
{
    if(n<10)
        return n;
    else
        return (n%10)+(DigitalSum(n/10));
}
int DigitalRoot(int n)
{
    if(n<10)
        return n;
    else
        return DigitalRoot(DigitalSum(n));
}
int main()
{
    int num=2018;
    printf("%d\n",DigitalRoot(num));
    return 0;
}

8、編寫一個函數reverse_string(char * string) 實現:將參數字符串中的字符反向排列

#include<stdio.h>
#include<assert.h>

int my_strlen(const char *p)
{
    assert(p);
    if (*p == 0)
        return 0;
    else
        return 1 + my_strlen(++p);
}

char *reverse_string(const char* p)
{
    assert(p);
    char *ret = p;
    if (*p != '\0')
    {
        reverse_string(++p);
    }
    printf("%c", *ret);
}
int main()
{
    char arr[] = "abcd1234";
    reverse_string(arr);
    printf("\n");
    system("pause");
    return 0;
}
發佈了55 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章