鱼C论坛

 找回密码
 立即注册
查看: 2038|回复: 5

[已解决]请问我这个递归出现啥问题了

[复制链接]
发表于 2018-1-23 10:28:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  题目是:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2))且输入的 A,B,n限制是(1 <= A, B <= 1000, 1 <= n <= 100,000,000),当A=B=n=0时退出程序.
为什么编译没有问题,但是输出不了结果的,请各位帮忙看一下。

#include <stdio.h>

int digui(int ,int ,int );

int digui(int A,int B,int n)
{
    int result;
    if(n==1||n==2) result=A*1+B*1;
    while(n>2)
    {
        result=A*digui(A,B,n-1)+B*digui(A,B,n-2);   //递归求值
    }
    return result;
}
int main()
{
    int A,B,n,result;
    while(scanf("%d %d %d",&A,&B,&n)!=EOF&&1<=A&&B<=1000&&1<=n<=100000000||A!=0||B!=0||n!=0)
    {
        result=digui(A,B,n);
        printf("%d\n",result);
    }
    return 0;
}

  
最佳答案
2018-1-23 11:15:31
将递归里面的while改成else; 假如你输入的n是3, 那么就会在while里面进入死循环
#include <stdio.h>
long int digui(int ,int ,int );

long int digui(int A, int B, int n)
{
        long int result;
        if ( n==1 || n==2 )
        {
                result = A*1 + B*1;
        }
        else
        {
                result = A*digui(A, B, n-1) + B*digui(A, B, n-2);   //递归求值
        }
        return result;
}
int main(void)
{
        int A, B, n;
        long int result;
        while( scanf("%d %d %d", &A, &B, &n) != EOF  )
        {
                if( 1 <= A && B <= 1000 && 1<=n<=100000000 )
                {
                result = digui ( A, B, n );
                printf("%ld\n", result);
                }
        }
        return 0;
}
有不足的地方多多沟通, 也是刚学C的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-23 11:15:31 | 显示全部楼层    本楼为最佳答案   
将递归里面的while改成else; 假如你输入的n是3, 那么就会在while里面进入死循环
#include <stdio.h>
long int digui(int ,int ,int );

long int digui(int A, int B, int n)
{
        long int result;
        if ( n==1 || n==2 )
        {
                result = A*1 + B*1;
        }
        else
        {
                result = A*digui(A, B, n-1) + B*digui(A, B, n-2);   //递归求值
        }
        return result;
}
int main(void)
{
        int A, B, n;
        long int result;
        while( scanf("%d %d %d", &A, &B, &n) != EOF  )
        {
                if( 1 <= A && B <= 1000 && 1<=n<=100000000 )
                {
                result = digui ( A, B, n );
                printf("%ld\n", result);
                }
        }
        return 0;
}
有不足的地方多多沟通, 也是刚学C的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 12:17:33 | 显示全部楼层
549444387@qq.co 发表于 2018-1-23 11:15
将递归里面的while改成else; 假如你输入的n是3, 那么就会在while里面进入死循环
#include
long int di ...

有道理,不过if里应该这样写,已经说明了f(1)=1,f(2)=1了,如下:
if ( n==1 || n==2 )
{
       result = 1;
}
else
      ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:39:45 | 显示全部楼层
549444387@qq.co 发表于 2018-1-23 11:15
将递归里面的while改成else; 假如你输入的n是3, 那么就会在while里面进入死循环
#include
long int di ...

哈哈,对喔,我竟然没有发现,谢谢哈!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 14:47:27 | 显示全部楼层
winkyboy 发表于 2018-1-23 13:39
哈哈,对喔,我竟然没有发现,谢谢哈!

我也是刚学C 哈哈 一起沟通交流学的比较快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 15:19:51 | 显示全部楼层
U201010009 发表于 2018-1-23 12:17
有道理,不过if里应该这样写,已经说明了f(1)=1,f(2)=1了,如下:
if ( n==1 || n==2 )
{

谢谢提醒喔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表