递归函数

递归函数简单练习:计算1+2+3+…+n的和

这一生的挚爱 提交于 2019-12-09 23:17:49
该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。 代码: 输入样例: 10 输出样例: 55 正确代码如下: #include < stdio . h > int sum ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; printf ( "%d\n" , sum ( n ) ) ; return 0 ; } int sum ( int n ) { if ( n <= 0 ) return 0 ; else return n + sum ( n - 1 ) ; //此处使用递归函数 } 来源: CSDN 作者: PureWhitew 链接: https://blog.csdn.net/m0_37264106/article/details/103465024

递归系列2(字符串翻转,12345翻转)

旧街凉风 提交于 2019-12-08 09:17:43
编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。 <span style="font-size:24px;">#include<stdio.h> void reverse_string(char * string) { if(*string != '\0') { reverse_string(string+1); printf("%c",*string); } else return; } int main() { char *p = "abcdef"; reverse_string(p); printf("\n"); return 0; } 把12345翻转成54321 #include<stdio.h> void print(int n) { if(n != 0) { printf("%d",n%10); print(n/10); } } int main() { int a = 12345; print(a); printf("\n"); return 0; } 另一种翻转 abcd 翻转成 dcba #include<stdio.h> void reverse_string(char * str) { int n = 0; char *p = str;

递归算法

好久不见. 提交于 2019-12-07 13:04:41
递归 (一)简单的斐波那契数列 以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列。 这个数列从第3项开始,每一项都等于前两项之和。 输入一个整数N,请你输出这个序列的前N项。 输入格式 一个整数N。 输出格式 在一行中输出斐波那契数列的前N项,数字之间用空格隔开。 数据范围 0 < N < 46 0<N<46 输入样例: 5 输出样例: 0 1 1 2 3思路:采用递归的思路+记忆化数组的方式 #include<iostream> using namespace std; int f[50]; int dfs(int x) { if(f[x]!=0) return f[x]; if(x==1) return 0; else if(x==2||x==3) return 1; else return f[x]=dfs(x-1)+dfs(x-2); } int main() { int i,j,n; cin>>n; for(i=1;i<=n;i++) cout<<dfs(i)<<" "; return 0; } (二) 递归实现指数型枚举 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 对于没有选任何数的方案,输出空行。

#C 递归求阶乘和

≡放荡痞女 提交于 2019-12-06 08:25:57
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。 函数接口定义: double fact( int n ); double factsum( int n ); 函数 fact 应返回 n 的阶乘,建议用递归实现。函数 factsum 应返回 1!+2!+...+ n ! 的值。题目保证输入输出在双精度范围内。 裁判测试程序样例: #include <stdio.h> double fact( int n ); double factsum( int n ); int main() { int n; scanf("%d",&n); printf("fact(%d) = %.0f\n", n, fact(n)); printf("sum = %.0f\n", factsum(n)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例1: 10 输出样例1: fact(10) = 3628800 sum = 4037913 输入样例2: 0 输出样例2: fact(0) = 1 sum = 0 1 #include <stdio.h> 2 double fact(int n); 3 double factsum(int n); 4 5 int main() { 6 int n; 7 8 scanf("%d", &n);

几种常见排序方法的基本介绍,性能分析,和c语言实现

不羁的心 提交于 2019-12-06 00:50:17
本文介绍8种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚, 本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换函数swap, 在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int length = sizeof(arr) / sizeof(int); sort(arr, length); for (int i = 0;i < length;i++) { printf("%d\n", arr[i]); } return 0; } 插入排序 第一次循环: 第二次循环: 第三次循环: 外层循环每执行一次就从无序区向有序区中插入一个数据arr[i]   里层循环控制插入的数据arr[i]与其前一个数据比较,如果比前一个数据小,就让前一个数据后移1位   ...不断重复上述步骤,直到找到不比arr[i]小的数据arr[j],因为arr[j]后面的数据都后移了1位,所以直接将arr[i]放在空闲的arr[j+1]位置 c程序实现: void CRsort(int arr[],

用函数递归的方法解决古印度汉诺塔hanoi问题

故事扮演 提交于 2019-12-05 08:47:23
问题源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 我们把柱子依次命名为A,B,C 从只有一个圆盘考虑:直接就是A-->C 两个圆盘的时候就是:A-->B, A-->C ,B-->C 三个圆盘的时候就是:A-->C,A-->B,C-->B, A-->C ,B-->A,B-->C,A-->C 其中标红色的步骤就是将原有最底下的圆盘从A-->C,执行这个步骤前我们可以发现实际上是先将A最底下大盘上的所有圆盘(即n-1)都移到B上,接着执行A-->C,最后再将B上n-1个圆盘从B移到C上,不难发现要将n-1个圆盘从B移到C上,也就是要借助A,将n-2个圆盘从B移到A上,这样才能将B上最底下圆盘移到C上。 def _move(n, a, b, c): if n == 1:                  # 只有一个圆盘时直接从A-->C print('move:', a, '-->', c) else: _move(n - 1, a, c, b)         # 现将n-1个圆盘从A-->B _move(1, a, b, c)            #

经典排序算法

随声附和 提交于 2019-12-05 08:34:10
  排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释: n:数据规模 k:“桶”的个数 In-place:占用常数内存,不占用额外内存 Out-place:占用额外内存 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同 冒泡排序   冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

递归越做越忘,刚开始还写的好,后来就无从下手,看完代码又恍然大悟

我的梦境 提交于 2019-12-05 04:17:57
设一个基准情况;再调用 第二个情况由第一个情况递推,再调用; 达到某个情况,返回值。 有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,请利用递归法编程计算并输出第5个人的年龄。 include <stdio.h> unsigned int ComputeAge(unsigned int n); main() { unsigned int n = 5; printf("The 5th person's age is %d\n", ComputeAge(n)); } /* 函数功能:用递归算法计算年龄 */ unsigned int ComputeAge(unsigned int n) { unsigned int age; if (n == 1) { age = 10; } else { age = ComputeAge(n - 1) + 2; } return age; } 来源: https://www.cnblogs.com/dosu/p/11905195.html

【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

前提是你 提交于 2019-12-04 20:51:38
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢。 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点都只有有限个子节点或无子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树里面没有环路(cycle) 1.2常见术语 节点的度 :一个节点含有的 子树的个数 称为该节点的度; 树的度 :一棵树中,最大的节点度称为树的度; 叶节点 或 终端节点 :度为零的节点; 非终端节点 或 分支节点 :度不为零的节点; 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点 或 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的 层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 深度 :对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0; 高度 :对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

第29课 互斥量与自解锁(std::mutex和lock系列)

北战南征 提交于 2019-12-04 17:55:48
一. 互斥量 (一)Mutex系列类   1. std::mutex:独占的互斥量, 不能递归使用 。   2. std::recursive_mutex: 递归互斥量 。允许同一线程多次获得该互斥锁,可以用来解决同一线程需要多次获取互斥量时死锁的问题。   3. std::time_mutex和std::recursive_time_mutex: 带超时的互斥量 。 前者是超时的独占锁,后者为超时的递归锁 。主要用于获取锁时增加超时等待功能,因为有时不知道获取锁需要多久,为了不至于一直等待下去,就设置一个等待超时时间。比std::mutex多了两个超时获取锁的接口:try_lock_for和try_lock_until //1. 独占互斥锁,不能递归使用 class mutex { public: //std::mutex不支持copy和move操作。 mutex(const mutex&) = delete; mutex& operator=(const mutex&) = delete; constexpr mutex() noexcept; //构造函数:新的对象是未锁的 ~mutex(); void lock(); //上锁 void unlock(); //解锁 bool try_lock(); //尝试上锁。成功,返回true。失败时返回false,但不阻塞