http://www.nowamagic.net/librarys/veda/detail/2316
回文问题的递归判断
#include "stdio.h" #include "string.h" int main(void) { int n, rs; char str[50]; printf("请输入需要判断回文的字符串:"); scanf("%s",&str); n = (int)strlen(str); rs = is_palindereme(str, n); printf("%d ", rs); } int is_palindereme(char *str, int n) { printf("Length: %d ",n); printf("%c ----- %c ", str[0], str[n-1]); if(n == 0 || n == 1) return 1; else{ //printf("%d, %d ", str[0], str[n-1]); return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0); } }
二分查找的递归实现
#include "stdio.h" #include "stdlib.h" void selectionSort(int data[], int count); int binary_search(int *a, int n, int key); void main() { int i, key, rs; int arr[10]; int count; printf("排序前数组为:"); srand((int)time(0)); for(i=0; i < 10; i++) { arr[i] = rand()%100; printf("%d ",arr[i]); } count = sizeof(arr)/sizeof(arr[0]); selectionSort(arr, count); printf(" 排序后数组为:"); for(i=0; i < 10; i++) { printf("%d ", arr[i]); } printf(" 请输入要查找的数字:"); scanf("%d",&key); rs = binary_search(arr, 10, key); printf("%d ", rs); } void selectionSort(int data[], int count) { int i, j, min, temp; for(i = 0; i < count; i ++) { /*find the minimum*/ min = i; for(j = i + 1; j < count; j ++) if(data[j] < data[min]) min = j; temp = data[i]; data[i] = data[min]; data[min] = temp; } } int binary_search(int *data, int n, int key) { int mid; if(n == 1){ return (data[0] == key); }else{ mid = n/2; printf("mid=%d ", data[mid]); if(data[mid-1] == key) return 1; else if(data[mid-1] > key) { printf("key %d 比 data[mid-1] %d 小,取前半段 ", key, data[mid-1]); return binary_search(&data[0], mid, key); } else { printf("key %d 比 data[mid-1] %d 大,取后半段 ", key, data[mid-1]); return binary_search(&data[mid], n - mid, key); } } }
优化的费波纳茨递归法
int fib_i(int a, int b , int n) { if(n == 3) return a+b; else return fib_i(b, a+b, n-1); }
考虑一下这个
尾递归计算
尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次。利用尾部递归最主要的目的是要优化
#include "stdio.h" #include "math.h" int factorial(int n); int main(void) { int i, n, rs; printf("请输入斐波那契数n:"); scanf("%d",&n); rs = factorial_tail(n, 1, 1); printf("%d ", rs); return 0; } int factorial_tail(int n,int acc1,int acc2) { if (n < 2) { return acc1; } else { return factorial_tail(n-1,acc2,acc1+acc2); } }