c语言-递归问题,求n的阶乘?

问题描述

递归问题,求n的阶乘?

 int sum2(n) {    int sum=0;    if (n<0) printf_s(""error
"");    //else if (n == 0 || n == 1) sum = 1;     else sum = sum2(n - 1)*n;    return sum;}

上图是将注释的话没有写在程序中的结果,不能理解为什么会是这样。。。

解决方案

我给你分析下,你细心看看就明白了。
递归调用就是不断调用自己。然后结合堆栈的原理进行入栈出栈。
比如 f(x)进行递归调用 ,在调用处函数中断。函数环境入栈。
直道有解得时候返回值,中断处得到返回值再进行处理出栈。逐层向上直道最顶层的中断恢复为止。
你可以认为是不断进行任务分解直道有解得时候返回 .(有解指的是函数能执行完毕不再调用其它函数)
所以得到调用序列 f1(x)f2(x)........fn(x) {其中fn=f}

现在我们看你的程序
写阶乘 n! = n*(n-1)!
f(x) = x!
f(n) = n * f(n-1) :函数在f(n-1)中断 fn-1
f(n-1) = (n-1)*f(n-2) : 函数在f(n-2)中断 fn-2
...
...
f(1) = 1 * f(0) : 函数在f(n-2)中断 f0 中断
这个时候就是关键的步骤。我们要设置 函数的解,不然你可以写出 f(-1)f(-2)....
也就是我们要设置函数的出口定义。
既然是出口要写在自身调用的上面,否则先自身调用再出口那么出口就是不可到达。
一旦定义了出口,就是结束函数调用的时点

你程序设计的时点是 :

    if (n<0) printf_s(""error
"");

你看程序在此时打印出error之后,会执行什么啊? 应该是 return sum巴
sum是多少阿? 由于你在函数首句定义了sum=0所以最后一次返回的是0
这样 导致没层中断的返回值都是0
所以结果就是0了

按照上面的分析你可一写出

    if(n==1)        return 1        retturn sum2(n - 1)*n

解决方案二:
试试下面的:
int sum = 1;
int sum2(int n)
{
if(n > 1)
{
sum = n * sum2(n - 1);
}
return sum;
}

另外: 不要加n < 0时打印error的语句,因为n会一直递减,最终都会小于0,error就打印出来

解决方案三:
01./*

02.*Copyright (c) 2014烟台大学计算机学院

03.*All rights reserved.

04.*文件名称: test.cpp

05.*作 者:李晓凡

06.*完成日期:2014年11月10日

07.*版本号:v1.0 ......
答案就在这里:用递归求n的阶乘

解决方案四:
按照你的程序自己一步步计算一下sum2(1)的每一步结果,应该能清楚。

解决方案五:
sum2(0)返回0,0乘任何数都是0。所以你注释掉的那句很关键。

解决方案六:
语法有错,if后面打印error之后加了“;”正常的为  if(){} else {}

解决方案七:
int sun2(int n)
{
if(n > 1)
{
return n*sum2(n-1);
}
else
{
return 1;
}
}

解决方案八:
int sun2(int n)
{
if(n > 1)
{
return n*sum2(n-1);
}
else
{
return 1;
}
}

时间: 2024-09-20 09:03:59

c语言-递归问题,求n的阶乘?的相关文章

使用C语言求N的阶乘的方法_C 语言

用递归法求N的阶乘 程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解. 递归的能力在于用有限的语句来定义对象的无限集合. 一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. #include <stdio.h> #include <string.h> #include <stdlib.h> long factorial(int n) {

c语言递归求阶乘 ,不知道哪里不对

问题描述 c语言递归求阶乘 ,不知道哪里不对 递归求阶乘出问题了 #include long f(i) { long f=1; while(i>=1) f*=f(i-1); return f; } main() { int i=10; printf("factorial=%d",f(i)); } 帮忙看一下! 解决方案 = =你的i传进去 就是为了判断的吗? while(i>1) f=i* f(i-1) 解决方案二: #include long f(int i){ if(i

c语言-C语言 递归,好像跳不出递归循环了,求大神帮忙看看

问题描述 C语言 递归,好像跳不出递归循环了,求大神帮忙看看 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. int num_pi=0; int num_yin=1; int money = 823; int fun(int mon); int main() { fun(0); return 0; } int fun(int mon) { if(mon > money) return 0; if(mon

C语言递归操作用法总结_C 语言

本文实例总结了C语言递归操作用法.分享给大家供大家参考,具体如下: 用归纳法来理解递归 步进表达式:问题蜕变成子问题的表达式结束条件:什么时候可以不再是用步进表达式直接求解表达式:在结束条件下能够直接计算返回值的表达式逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了. 递归算法的一般形式: void func( mode) { if(endCondition) { constExpression //基本项 } else { accumrateEx

c语言初级编程 求解答

问题描述 c语言初级编程 求解答 Write a program that adds two numbers using the three functions ? Function 1 : int main(void) ? Function 2 : int Input(void) ? Function 3 : int Add(int i, int j) Ex)(例子) Input two numbers : 3 4 Results : 7 解决方案 图和文字不相符 以你的文字为准: #incl

C语言初学妹子求大神解决程序错误问题,求正解

问题描述 C语言初学妹子求大神解决程序错误问题,求正解 /*分别用while.do-while和for循环求:1!+2!+...+n!. 设计一个主界面,实现连续读入不同的n值并求解:*/ #include //用while实现 int main() { while(1) { int i=1,j=1,s=0,m=1; int n; printf("请输入n的值:n"); scanf("%dn",&n); if(n<1) break; else { s=

java递归法求字符串逆序_java

本文实例讲述了java递归法求字符串逆序的方法.分享给大家供大家参考.具体实现方法如下: public static String reverseString(String x) { if(x==null || x.length()<2) return x; return reverseString(x.substring(1,x.length()))+ x.charAt(0); } 希望本文所述对大家的java程序设计有所帮助. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课

c语言-C语言小白问题求大神指教

问题描述 C语言小白问题求大神指教 #include #include unsigned fun(int w) { int a; int i; i=1; a=w; while(a==0) { a=a/10; i++; } w=w%pow(10,i); return w; } unsigned main() { int w; printf("please enter a number:n"); scanf("%d",&w); printf("the

C语言递归实现汉诺塔算法

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1) 直接将A柱子上的圆盘从A移动到C else 先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上 直接将A柱子上的第n个圆盘移动到C柱子上 最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 操作系统:ubuntu 编译软件:gcc 结果截